<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Nand Flash 基础 | ShuangChenYue</title>
    <meta name="generator" content="VuePress 1.9.10">
    <link rel="icon" href="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/logo/白云.38zbldnhh180.jpg">
    <meta name="description" content="满招损，谦受益">
    <meta name="keywords" content="专注于Cpp语言的旅行者">
    
    <link rel="preload" href="/assets/css/0.styles.952d6952.css" as="style"><link rel="preload" href="/assets/js/app.67adcfd9.js" as="script"><link rel="preload" href="/assets/js/4.9aaa1650.js" as="script"><link rel="preload" href="/assets/js/1.5474518c.js" as="script"><link rel="preload" href="/assets/js/3.593d14fc.js" as="script"><link rel="preload" href="/assets/js/185.bcf4ab71.js" as="script"><link rel="prefetch" href="/assets/js/10.3242746b.js"><link rel="prefetch" href="/assets/js/100.9224de43.js"><link rel="prefetch" href="/assets/js/101.f0d1b059.js"><link rel="prefetch" href="/assets/js/102.996bfc6d.js"><link rel="prefetch" href="/assets/js/103.9bfdbd6f.js"><link rel="prefetch" href="/assets/js/104.8613f283.js"><link rel="prefetch" href="/assets/js/105.aa6e809e.js"><link rel="prefetch" href="/assets/js/106.90192392.js"><link rel="prefetch" href="/assets/js/107.e82a40b7.js"><link rel="prefetch" href="/assets/js/108.994cd438.js"><link rel="prefetch" href="/assets/js/109.ec15acc2.js"><link rel="prefetch" href="/assets/js/11.c04b41c1.js"><link rel="prefetch" href="/assets/js/110.c32d8576.js"><link rel="prefetch" href="/assets/js/111.453b5d50.js"><link rel="prefetch" href="/assets/js/112.ffbdb3a4.js"><link rel="prefetch" href="/assets/js/113.12b8ad7d.js"><link rel="prefetch" href="/assets/js/114.899d2998.js"><link rel="prefetch" href="/assets/js/115.b7ad9576.js"><link rel="prefetch" href="/assets/js/116.a8394748.js"><link rel="prefetch" href="/assets/js/117.0edfe25b.js"><link rel="prefetch" href="/assets/js/118.9161b1fe.js"><link rel="prefetch" href="/assets/js/119.be59e21b.js"><link rel="prefetch" href="/assets/js/12.41437bf6.js"><link rel="prefetch" href="/assets/js/120.bcf439fb.js"><link rel="prefetch" href="/assets/js/121.c3d251b8.js"><link rel="prefetch" href="/assets/js/122.62b1caba.js"><link rel="prefetch" href="/assets/js/123.787c2ab0.js"><link rel="prefetch" href="/assets/js/124.a880746f.js"><link rel="prefetch" href="/assets/js/125.d8edfe7b.js"><link rel="prefetch" href="/assets/js/126.4ff01546.js"><link rel="prefetch" href="/assets/js/127.9416d1ff.js"><link rel="prefetch" href="/assets/js/128.01a4a7a0.js"><link rel="prefetch" href="/assets/js/129.76876665.js"><link rel="prefetch" href="/assets/js/13.922328e9.js"><link rel="prefetch" href="/assets/js/130.7f631dd9.js"><link rel="prefetch" href="/assets/js/131.c9e0fde9.js"><link rel="prefetch" href="/assets/js/132.1c04cde5.js"><link rel="prefetch" href="/assets/js/133.e8f381cd.js"><link rel="prefetch" href="/assets/js/134.03d19f8b.js"><link rel="prefetch" href="/assets/js/135.44607494.js"><link rel="prefetch" href="/assets/js/136.6a1eb3c9.js"><link rel="prefetch" href="/assets/js/137.27898fd1.js"><link rel="prefetch" href="/assets/js/138.5bc0cf54.js"><link rel="prefetch" href="/assets/js/139.c2d1addc.js"><link rel="prefetch" href="/assets/js/14.e54d7526.js"><link rel="prefetch" href="/assets/js/140.052ec8e4.js"><link rel="prefetch" href="/assets/js/141.131abb5a.js"><link rel="prefetch" href="/assets/js/142.6ba6c07b.js"><link rel="prefetch" href="/assets/js/143.5dd51d22.js"><link rel="prefetch" href="/assets/js/144.b45afca8.js"><link rel="prefetch" href="/assets/js/145.faa9fb04.js"><link rel="prefetch" href="/assets/js/146.b54c024d.js"><link rel="prefetch" href="/assets/js/147.a1223242.js"><link rel="prefetch" href="/assets/js/148.4767bcb2.js"><link rel="prefetch" href="/assets/js/149.b65ab046.js"><link rel="prefetch" href="/assets/js/15.7082a3da.js"><link rel="prefetch" href="/assets/js/150.9bd8c175.js"><link rel="prefetch" href="/assets/js/151.9f830e96.js"><link rel="prefetch" href="/assets/js/152.41cde7f0.js"><link rel="prefetch" href="/assets/js/153.f57d65e0.js"><link rel="prefetch" href="/assets/js/154.5d7c8d51.js"><link rel="prefetch" href="/assets/js/155.0ae99532.js"><link rel="prefetch" href="/assets/js/156.5a54e043.js"><link rel="prefetch" href="/assets/js/157.c25b5d40.js"><link rel="prefetch" href="/assets/js/158.aa025b46.js"><link rel="prefetch" href="/assets/js/159.47939d88.js"><link rel="prefetch" href="/assets/js/16.fc775b7b.js"><link rel="prefetch" href="/assets/js/160.f8624459.js"><link rel="prefetch" href="/assets/js/161.7a075dc2.js"><link rel="prefetch" href="/assets/js/162.1d48f266.js"><link rel="prefetch" href="/assets/js/163.5d68a99f.js"><link rel="prefetch" href="/assets/js/164.1262d0e5.js"><link rel="prefetch" href="/assets/js/165.2ccf0bdd.js"><link rel="prefetch" href="/assets/js/166.21ece4d9.js"><link rel="prefetch" href="/assets/js/167.bf8adb95.js"><link rel="prefetch" href="/assets/js/168.1cb8440d.js"><link rel="prefetch" href="/assets/js/169.1dd1e396.js"><link rel="prefetch" href="/assets/js/17.ecc7be70.js"><link rel="prefetch" href="/assets/js/170.c29ec18f.js"><link rel="prefetch" href="/assets/js/171.38820827.js"><link rel="prefetch" href="/assets/js/172.bbc8ffc6.js"><link rel="prefetch" href="/assets/js/173.470e21e7.js"><link rel="prefetch" href="/assets/js/174.3c2df318.js"><link rel="prefetch" href="/assets/js/175.d2690cdb.js"><link rel="prefetch" href="/assets/js/176.9ca64696.js"><link rel="prefetch" href="/assets/js/177.76f3271d.js"><link rel="prefetch" href="/assets/js/178.d7d9def2.js"><link rel="prefetch" href="/assets/js/179.b5644743.js"><link rel="prefetch" href="/assets/js/18.31fe7ecd.js"><link rel="prefetch" href="/assets/js/180.7592d5ef.js"><link rel="prefetch" href="/assets/js/181.5cb77d35.js"><link rel="prefetch" href="/assets/js/182.6fa5633c.js"><link rel="prefetch" href="/assets/js/183.b3a53d1b.js"><link rel="prefetch" href="/assets/js/184.3815c537.js"><link rel="prefetch" href="/assets/js/186.1cc02f6d.js"><link rel="prefetch" href="/assets/js/187.8b425fb7.js"><link rel="prefetch" href="/assets/js/188.44ccbd02.js"><link rel="prefetch" href="/assets/js/189.353b35e3.js"><link rel="prefetch" href="/assets/js/19.520992d5.js"><link rel="prefetch" href="/assets/js/190.c284595f.js"><link rel="prefetch" href="/assets/js/191.788ecc2d.js"><link rel="prefetch" href="/assets/js/192.712a164e.js"><link rel="prefetch" href="/assets/js/193.da58aba3.js"><link rel="prefetch" href="/assets/js/194.6b1b1f4d.js"><link rel="prefetch" href="/assets/js/195.c31d5c39.js"><link rel="prefetch" href="/assets/js/196.f6670c4d.js"><link rel="prefetch" href="/assets/js/197.5a1f50ab.js"><link rel="prefetch" href="/assets/js/2.ab565158.js"><link rel="prefetch" href="/assets/js/20.69e29cdc.js"><link rel="prefetch" href="/assets/js/21.2fd424ad.js"><link rel="prefetch" href="/assets/js/22.d4c0be54.js"><link rel="prefetch" href="/assets/js/23.4bb90ecc.js"><link rel="prefetch" href="/assets/js/24.c01be6b2.js"><link rel="prefetch" href="/assets/js/25.c8833687.js"><link rel="prefetch" href="/assets/js/26.8042b555.js"><link rel="prefetch" href="/assets/js/27.0d5fa4c0.js"><link rel="prefetch" href="/assets/js/28.f9735b8b.js"><link rel="prefetch" href="/assets/js/29.3af53626.js"><link rel="prefetch" href="/assets/js/30.5f1b56d1.js"><link rel="prefetch" href="/assets/js/31.544b2649.js"><link rel="prefetch" href="/assets/js/32.aa321988.js"><link rel="prefetch" href="/assets/js/33.6aba2c86.js"><link rel="prefetch" href="/assets/js/34.e1bbff24.js"><link rel="prefetch" href="/assets/js/35.233f76e0.js"><link rel="prefetch" href="/assets/js/36.cb773972.js"><link rel="prefetch" href="/assets/js/37.393d9c59.js"><link rel="prefetch" href="/assets/js/38.e2d530c5.js"><link rel="prefetch" href="/assets/js/39.acaf1cc0.js"><link rel="prefetch" href="/assets/js/40.358f731e.js"><link rel="prefetch" href="/assets/js/41.ded24b7e.js"><link rel="prefetch" href="/assets/js/42.b9f683c3.js"><link rel="prefetch" href="/assets/js/43.c8fb3e66.js"><link rel="prefetch" href="/assets/js/44.633142da.js"><link rel="prefetch" href="/assets/js/45.6095e772.js"><link rel="prefetch" href="/assets/js/46.421d8c7a.js"><link rel="prefetch" href="/assets/js/47.da50fe47.js"><link rel="prefetch" href="/assets/js/48.15ff5726.js"><link rel="prefetch" href="/assets/js/49.b662e624.js"><link rel="prefetch" href="/assets/js/5.c1b8a209.js"><link rel="prefetch" href="/assets/js/50.a8bc75df.js"><link rel="prefetch" href="/assets/js/51.51e36ae7.js"><link rel="prefetch" href="/assets/js/52.54cc6e51.js"><link rel="prefetch" href="/assets/js/53.4173561d.js"><link rel="prefetch" href="/assets/js/54.7cab8416.js"><link rel="prefetch" href="/assets/js/55.3d7317d3.js"><link rel="prefetch" href="/assets/js/56.3c22255b.js"><link rel="prefetch" href="/assets/js/57.18e46e30.js"><link rel="prefetch" href="/assets/js/58.aad57f31.js"><link rel="prefetch" href="/assets/js/59.7897f6a7.js"><link rel="prefetch" href="/assets/js/6.3131f88a.js"><link rel="prefetch" href="/assets/js/60.5cd0051a.js"><link rel="prefetch" href="/assets/js/61.d9606403.js"><link rel="prefetch" href="/assets/js/62.aede9df0.js"><link rel="prefetch" href="/assets/js/63.2c30e554.js"><link rel="prefetch" href="/assets/js/64.18228ab7.js"><link rel="prefetch" href="/assets/js/65.27cb3fba.js"><link rel="prefetch" href="/assets/js/66.2fa6c2dc.js"><link rel="prefetch" href="/assets/js/67.d274a8df.js"><link rel="prefetch" href="/assets/js/68.3069cfcf.js"><link rel="prefetch" href="/assets/js/69.4c28600f.js"><link rel="prefetch" href="/assets/js/7.89e6165d.js"><link rel="prefetch" href="/assets/js/70.4175440c.js"><link rel="prefetch" href="/assets/js/71.2ee6b435.js"><link rel="prefetch" href="/assets/js/72.c75e3bb8.js"><link rel="prefetch" href="/assets/js/73.6f8b8211.js"><link rel="prefetch" href="/assets/js/74.6c7720cf.js"><link rel="prefetch" href="/assets/js/75.cccfb229.js"><link rel="prefetch" href="/assets/js/76.f022e5da.js"><link rel="prefetch" href="/assets/js/77.dab46206.js"><link rel="prefetch" href="/assets/js/78.ca574b2a.js"><link rel="prefetch" href="/assets/js/79.3d75e618.js"><link rel="prefetch" href="/assets/js/80.091749b1.js"><link rel="prefetch" href="/assets/js/81.14db0e21.js"><link rel="prefetch" href="/assets/js/82.8a2b1809.js"><link rel="prefetch" href="/assets/js/83.84a4b599.js"><link rel="prefetch" href="/assets/js/84.11d7c222.js"><link rel="prefetch" href="/assets/js/85.273d4388.js"><link rel="prefetch" href="/assets/js/86.fb40e20c.js"><link rel="prefetch" href="/assets/js/87.3316639e.js"><link rel="prefetch" href="/assets/js/88.dfc52200.js"><link rel="prefetch" href="/assets/js/89.8d615f6e.js"><link rel="prefetch" href="/assets/js/90.1d9f08bb.js"><link rel="prefetch" href="/assets/js/91.566813e7.js"><link rel="prefetch" href="/assets/js/92.d13c6f41.js"><link rel="prefetch" href="/assets/js/93.845c42a0.js"><link rel="prefetch" href="/assets/js/94.20a37b77.js"><link rel="prefetch" href="/assets/js/95.1a498005.js"><link rel="prefetch" href="/assets/js/96.39fa7f4b.js"><link rel="prefetch" href="/assets/js/97.50f7170e.js"><link rel="prefetch" href="/assets/js/98.dd2e15d6.js"><link rel="prefetch" href="/assets/js/99.ef7ea06a.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.ae6b1de9.js">
    <link rel="stylesheet" href="/assets/css/0.styles.952d6952.css">
  </head>
  <body class="theme-mode-light">
    <div id="app" data-server-rendered="true"><div class="theme-container sidebar-open have-rightmenu"><header class="navbar blur"><div title="目录" class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><img src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/logo/白云.38zbldnhh180.jpg" alt="ShuangChenYue" class="logo"> <span class="site-name can-hide">ShuangChenYue</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link">首页</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="CPP语言" class="dropdown-title"><!----> <span class="title" style="display:;">CPP语言</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/c5bdd8/" class="nav-link">Cpp之旅</a></li><li class="dropdown-item"><!----> <a href="/pages/279e62/" class="nav-link">Cpp专栏</a></li><li class="dropdown-item"><!----> <a href="/pages/801755/" class="nav-link">Effective_CPP</a></li><li class="dropdown-item"><!----> <a href="/pages/6b2468/" class="nav-link">muduo网络库</a></li><li class="dropdown-item"><!----> <a href="/pages/5f8c9f/" class="nav-link">Unix环境高级编程</a></li><li class="dropdown-item"><!----> <a href="/pages/3f1d21/" class="nav-link">Cpp提高编程</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="计算机基础" class="dropdown-title"><!----> <span class="title" style="display:;">计算机基础</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/7b1cb2/" class="nav-link">计算机网络</a></li><li class="dropdown-item"><!----> <a href="/pages/6048a8/" class="nav-link">操作系统</a></li><li class="dropdown-item"><!----> <a href="/pages/3b34ba/" class="nav-link">数据结构</a></li><li class="dropdown-item"><!----> <a href="/pages/412fe7/" class="nav-link">Linux</a></li><li class="dropdown-item"><!----> <a href="/pages/2dcfa1/" class="nav-link">算法</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="数据库" class="dropdown-title"><!----> <span class="title" style="display:;">数据库</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/efa3f2/" class="nav-link">基础篇</a></li><li class="dropdown-item"><!----> <a href="/pages/ccc445/" class="nav-link">MySql</a></li><li class="dropdown-item"><!----> <a href="/pages/54616e/" class="nav-link">Redis</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="嵌入式软件开发" class="dropdown-title"><!----> <span class="title" style="display:;">嵌入式软件开发</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/d142c2/" class="nav-link">电子嵌入式通信协议</a></li><li class="dropdown-item"><!----> <a href="/pages/4c6bf3/" class="nav-link">深入浅出SSD</a></li><li class="dropdown-item"><!----> <a href="/pages/d3f36a/" class="nav-link">文件系统</a></li><li class="dropdown-item"><!----> <a href="/pages/e0cca7/" class="nav-link">汇编语言</a></li><li class="dropdown-item"><!----> <a href="/pages/fab2d7/" class="nav-link">STM32</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="开发日常" class="dropdown-title"><!----> <span class="title" style="display:;">开发日常</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/e472d1/" class="nav-link">随笔（持续更新）</a></li><li class="dropdown-item"><!----> <a href="/pages/71f6ae/" class="nav-link">Git知识总结</a></li><li class="dropdown-item"><!----> <a href="/pages/db6fb8/" class="nav-link">Git备忘清单</a></li><li class="dropdown-item"><!----> <a href="/pages/e1081f/" class="nav-link">Git 创建删除远程分支</a></li><li class="dropdown-item"><!----> <a href="/pages/777b8a/" class="nav-link">nvm使用小结</a></li><li class="dropdown-item"><!----> <a href="/pages/ee770e/" class="nav-link">虚拟机固定 IP 地址</a></li><li class="dropdown-item"><!----> <a href="/pages/1ab9a6/" class="nav-link">Shell 脚本学习笔记</a></li><li class="dropdown-item"><!----> <a href="/pages/411aa4/" class="nav-link">VScode 插件 CodeGeeX 使用教程</a></li><li class="dropdown-item"><!----> <a href="/pages/0d525d/" class="nav-link">KylinV10 将项目上传至 Github教程</a></li><li class="dropdown-item"><!----> <a href="/pages/907786/" class="nav-link">KylinV10 安装 MySQL 教程（可防踩雷）</a></li><li class="dropdown-item"><!----> <a href="/pages/a2d21e/" class="nav-link">kylinV10-SP1 安装 QT</a></li><li class="dropdown-item"><!----> <a href="/pages/b561cf/" class="nav-link">高并发内存池</a></li><li class="dropdown-item"><!----> <a href="/pages/6ab6d1/" class="nav-link">USBGUARD 项目编译环境配置</a></li><li class="dropdown-item"><!----> <a href="/pages/883f02/" class="nav-link">Power_Destory 项目</a></li><li class="dropdown-item"><!----> <a href="/pages/479472/" class="nav-link">U 盘清除工具编译教程</a></li><li class="dropdown-item"><!----> <a href="/pages/9c4241/" class="nav-link">个人博客代码推送教程</a></li><li class="dropdown-item"><!----> <a href="/pages/3ad765/" class="nav-link">SVN Trunk Branches的Merge操作</a></li><li class="dropdown-item"><!----> <a href="/pages/0c0ca8/" class="nav-link">如何高效阅读嵌入式项目代码</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端学习" class="dropdown-title"><!----> <span class="title" style="display:;">前端学习</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/99897f/" class="nav-link">HTML与CSS</a></li><li class="dropdown-item"><!----> <a href="/pages/51542d/" class="nav-link">JS学习</a></li><li class="dropdown-item"><!----> <a href="/pages/803f9d/" class="nav-link">Vue3入门</a></li><li class="dropdown-item"><!----> <a href="/pages/ca4cfb/" class="nav-link">Vue3进阶</a></li><li class="dropdown-item"><!----> <a href="/pages/50e8d3/" class="nav-link">黑马Vue3</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="MFC" class="dropdown-title"><!----> <span class="title" style="display:;">MFC</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/a4b108/" class="nav-link">MFC编程随记</a></li><li class="dropdown-item"><!----> <a href="/pages/41acbd/" class="nav-link">MFC实现ini配置文件的读取</a></li><li class="dropdown-item"><!----> <a href="/pages/951a7a/" class="nav-link">MFC实现点击列表头排序</a></li><li class="dropdown-item"><!----> <a href="/pages/a8598f/" class="nav-link">贴图法美化Button按钮</a></li><li class="dropdown-item"><!----> <a href="/pages/054516/" class="nav-link">MFC使用细节</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="闪存" class="dropdown-title"><!----> <span class="title" style="display:;">闪存</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/b925b8/" class="nav-link">如何高效阅读嵌入式项目代码</a></li><li class="dropdown-item"><!----> <a href="/pages/28ec23/" class="nav-link">NAND Flash</a></li><li class="dropdown-item"><!----> <a href="/pages/62bf40/" class="nav-link">ARM 处理器</a></li><li class="dropdown-item"><!----> <a href="/pages/1a9374/" class="nav-link">嵌入式基础知识-存储器</a></li><li class="dropdown-item"><!----> <a href="/pages/aac5e3/" class="nav-link">闪存存储和制造技术概述</a></li><li class="dropdown-item"><!----> <a href="/pages/8f6056/" class="nav-link">芯片IO驱动力</a></li><li class="dropdown-item"><!----> <a href="/pages/d146b8/" class="nav-link">主流先进封装技术介绍</a></li><li class="dropdown-item"><!----> <a href="/pages/16f0ba/" aria-current="page" class="nav-link router-link-exact-active router-link-active">NAND Flash基础</a></li><li class="dropdown-item"><!----> <a href="/pages/90d8d0/" class="nav-link">基于PA算法的FTL引导</a></li><li class="dropdown-item"><!----> <a href="/pages/eb672b/" class="nav-link">SD逻辑擦除和物理擦除</a></li><li class="dropdown-item"><!----> <a href="/pages/747121/" class="nav-link">NAND Flash的SDR、ONFI、DDR接口</a></li><li class="dropdown-item"><!----> <a href="/pages/1eb351/" class="nav-link">【详解】Nand Flash必看知识</a></li><li class="dropdown-item"><!----> <a href="/pages/d2512a/" class="nav-link">【两万字详解】Nand Flash必看知识</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="面经" class="dropdown-title"><!----> <span class="title" style="display:;">面经</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/d69946/" class="nav-link">虎牙C++技术面经</a></li><li class="dropdown-item"><!----> <a href="/pages/29251d/" class="nav-link">金山一面复习</a></li><li class="dropdown-item"><!----> <a href="/pages/c7c01f/" class="nav-link">完美世界秋招 C++ 游戏开发面经(Cpp部分)</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="其它" class="dropdown-title"><!----> <span class="title" style="display:;">其它</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/fa256e/" class="nav-link">博客搭建</a></li><li class="dropdown-item"><!----> <a href="/pages/335531/" class="nav-link">网站收藏箱</a></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar-hover-trigger"></div> <aside class="sidebar" style="display:none;"><!----> <nav class="nav-links"><div class="nav-item"><a href="/" class="nav-link">首页</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="CPP语言" class="dropdown-title"><!----> <span class="title" style="display:;">CPP语言</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/c5bdd8/" class="nav-link">Cpp之旅</a></li><li class="dropdown-item"><!----> <a href="/pages/279e62/" class="nav-link">Cpp专栏</a></li><li class="dropdown-item"><!----> <a href="/pages/801755/" class="nav-link">Effective_CPP</a></li><li class="dropdown-item"><!----> <a href="/pages/6b2468/" class="nav-link">muduo网络库</a></li><li class="dropdown-item"><!----> <a href="/pages/5f8c9f/" class="nav-link">Unix环境高级编程</a></li><li class="dropdown-item"><!----> <a href="/pages/3f1d21/" class="nav-link">Cpp提高编程</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="计算机基础" class="dropdown-title"><!----> <span class="title" style="display:;">计算机基础</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/7b1cb2/" class="nav-link">计算机网络</a></li><li class="dropdown-item"><!----> <a href="/pages/6048a8/" class="nav-link">操作系统</a></li><li class="dropdown-item"><!----> <a href="/pages/3b34ba/" class="nav-link">数据结构</a></li><li class="dropdown-item"><!----> <a href="/pages/412fe7/" class="nav-link">Linux</a></li><li class="dropdown-item"><!----> <a href="/pages/2dcfa1/" class="nav-link">算法</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="数据库" class="dropdown-title"><!----> <span class="title" style="display:;">数据库</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/efa3f2/" class="nav-link">基础篇</a></li><li class="dropdown-item"><!----> <a href="/pages/ccc445/" class="nav-link">MySql</a></li><li class="dropdown-item"><!----> <a href="/pages/54616e/" class="nav-link">Redis</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="嵌入式软件开发" class="dropdown-title"><!----> <span class="title" style="display:;">嵌入式软件开发</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/d142c2/" class="nav-link">电子嵌入式通信协议</a></li><li class="dropdown-item"><!----> <a href="/pages/4c6bf3/" class="nav-link">深入浅出SSD</a></li><li class="dropdown-item"><!----> <a href="/pages/d3f36a/" class="nav-link">文件系统</a></li><li class="dropdown-item"><!----> <a href="/pages/e0cca7/" class="nav-link">汇编语言</a></li><li class="dropdown-item"><!----> <a href="/pages/fab2d7/" class="nav-link">STM32</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="开发日常" class="dropdown-title"><!----> <span class="title" style="display:;">开发日常</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/e472d1/" class="nav-link">随笔（持续更新）</a></li><li class="dropdown-item"><!----> <a href="/pages/71f6ae/" class="nav-link">Git知识总结</a></li><li class="dropdown-item"><!----> <a href="/pages/db6fb8/" class="nav-link">Git备忘清单</a></li><li class="dropdown-item"><!----> <a href="/pages/e1081f/" class="nav-link">Git 创建删除远程分支</a></li><li class="dropdown-item"><!----> <a href="/pages/777b8a/" class="nav-link">nvm使用小结</a></li><li class="dropdown-item"><!----> <a href="/pages/ee770e/" class="nav-link">虚拟机固定 IP 地址</a></li><li class="dropdown-item"><!----> <a href="/pages/1ab9a6/" class="nav-link">Shell 脚本学习笔记</a></li><li class="dropdown-item"><!----> <a href="/pages/411aa4/" class="nav-link">VScode 插件 CodeGeeX 使用教程</a></li><li class="dropdown-item"><!----> <a href="/pages/0d525d/" class="nav-link">KylinV10 将项目上传至 Github教程</a></li><li class="dropdown-item"><!----> <a href="/pages/907786/" class="nav-link">KylinV10 安装 MySQL 教程（可防踩雷）</a></li><li class="dropdown-item"><!----> <a href="/pages/a2d21e/" class="nav-link">kylinV10-SP1 安装 QT</a></li><li class="dropdown-item"><!----> <a href="/pages/b561cf/" class="nav-link">高并发内存池</a></li><li class="dropdown-item"><!----> <a href="/pages/6ab6d1/" class="nav-link">USBGUARD 项目编译环境配置</a></li><li class="dropdown-item"><!----> <a href="/pages/883f02/" class="nav-link">Power_Destory 项目</a></li><li class="dropdown-item"><!----> <a href="/pages/479472/" class="nav-link">U 盘清除工具编译教程</a></li><li class="dropdown-item"><!----> <a href="/pages/9c4241/" class="nav-link">个人博客代码推送教程</a></li><li class="dropdown-item"><!----> <a href="/pages/3ad765/" class="nav-link">SVN Trunk Branches的Merge操作</a></li><li class="dropdown-item"><!----> <a href="/pages/0c0ca8/" class="nav-link">如何高效阅读嵌入式项目代码</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端学习" class="dropdown-title"><!----> <span class="title" style="display:;">前端学习</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/99897f/" class="nav-link">HTML与CSS</a></li><li class="dropdown-item"><!----> <a href="/pages/51542d/" class="nav-link">JS学习</a></li><li class="dropdown-item"><!----> <a href="/pages/803f9d/" class="nav-link">Vue3入门</a></li><li class="dropdown-item"><!----> <a href="/pages/ca4cfb/" class="nav-link">Vue3进阶</a></li><li class="dropdown-item"><!----> <a href="/pages/50e8d3/" class="nav-link">黑马Vue3</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="MFC" class="dropdown-title"><!----> <span class="title" style="display:;">MFC</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/a4b108/" class="nav-link">MFC编程随记</a></li><li class="dropdown-item"><!----> <a href="/pages/41acbd/" class="nav-link">MFC实现ini配置文件的读取</a></li><li class="dropdown-item"><!----> <a href="/pages/951a7a/" class="nav-link">MFC实现点击列表头排序</a></li><li class="dropdown-item"><!----> <a href="/pages/a8598f/" class="nav-link">贴图法美化Button按钮</a></li><li class="dropdown-item"><!----> <a href="/pages/054516/" class="nav-link">MFC使用细节</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="闪存" class="dropdown-title"><!----> <span class="title" style="display:;">闪存</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/b925b8/" class="nav-link">如何高效阅读嵌入式项目代码</a></li><li class="dropdown-item"><!----> <a href="/pages/28ec23/" class="nav-link">NAND Flash</a></li><li class="dropdown-item"><!----> <a href="/pages/62bf40/" class="nav-link">ARM 处理器</a></li><li class="dropdown-item"><!----> <a href="/pages/1a9374/" class="nav-link">嵌入式基础知识-存储器</a></li><li class="dropdown-item"><!----> <a href="/pages/aac5e3/" class="nav-link">闪存存储和制造技术概述</a></li><li class="dropdown-item"><!----> <a href="/pages/8f6056/" class="nav-link">芯片IO驱动力</a></li><li class="dropdown-item"><!----> <a href="/pages/d146b8/" class="nav-link">主流先进封装技术介绍</a></li><li class="dropdown-item"><!----> <a href="/pages/16f0ba/" aria-current="page" class="nav-link router-link-exact-active router-link-active">NAND Flash基础</a></li><li class="dropdown-item"><!----> <a href="/pages/90d8d0/" class="nav-link">基于PA算法的FTL引导</a></li><li class="dropdown-item"><!----> <a href="/pages/eb672b/" class="nav-link">SD逻辑擦除和物理擦除</a></li><li class="dropdown-item"><!----> <a href="/pages/747121/" class="nav-link">NAND Flash的SDR、ONFI、DDR接口</a></li><li class="dropdown-item"><!----> <a href="/pages/1eb351/" class="nav-link">【详解】Nand Flash必看知识</a></li><li class="dropdown-item"><!----> <a href="/pages/d2512a/" class="nav-link">【两万字详解】Nand Flash必看知识</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="面经" class="dropdown-title"><!----> <span class="title" style="display:;">面经</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/d69946/" class="nav-link">虎牙C++技术面经</a></li><li class="dropdown-item"><!----> <a href="/pages/29251d/" class="nav-link">金山一面复习</a></li><li class="dropdown-item"><!----> <a href="/pages/c7c01f/" class="nav-link">完美世界秋招 C++ 游戏开发面经(Cpp部分)</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="其它" class="dropdown-title"><!----> <span class="title" style="display:;">其它</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/fa256e/" class="nav-link">博客搭建</a></li><li class="dropdown-item"><!----> <a href="/pages/335531/" class="nav-link">网站收藏箱</a></li></ul></div></div> <!----></nav>  <ul class="sidebar-links"><li><a href="/pages/1a9374/" class="sidebar-link">嵌入式基础知识——存储器</a></li><li><a href="/pages/b925b8/" class="sidebar-link">如何高效阅读嵌入式项目代码</a></li><li><a href="/pages/aac5e3/" class="sidebar-link">闪存存储和制造技术概述</a></li><li><a href="/pages/8f6056/" class="sidebar-link">芯片 IO 驱动力</a></li><li><a href="/pages/62bf40/" class="sidebar-link">ARM处理器</a></li><li><a href="/pages/28ec23/" class="sidebar-link">Nand Flash</a></li><li><a href="/pages/d146b8/" class="sidebar-link">主流先进封装技术介绍</a></li><li><a href="/pages/16f0ba/" aria-current="page" class="active sidebar-link">Nand Flash 基础</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_1-什么是-slc、mlc、tlc-各有什么特点" class="sidebar-link">1. 什么是 SLC、MLC、TLC，各有什么特点？</a></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_2-描述-flash-的基本结构-lun、die、plane、block、page" class="sidebar-link">2.  描述 Flash 的基本结构？（LUN、Die、Plane、Block、Page）</a></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_3-常见的-nandflash-有哪几种接口" class="sidebar-link">3.  常见的 NandFlash 有哪几种接口？</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_1-parallel-nand-并行-nand-接口" class="sidebar-link">1. Parallel NAND (并行 NAND 接口)</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_2-serial-nand-串行-nand-接口" class="sidebar-link">2. Serial NAND (串行 NAND 接口)</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_3-emmc-embedded-multimediacard" class="sidebar-link">==3. eMMC (embedded MultiMediaCard)==</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_4-ufs-universal-flash-storage" class="sidebar-link">==4. UFS (Universal Flash Storage)==</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_5-onfi-open-nand-flash-interface" class="sidebar-link">==5. ONFi (Open NAND Flash Interface)==</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_6-toggle-nand-toggle-mode-nand" class="sidebar-link">==6. Toggle NAND (Toggle-Mode NAND)==</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_7-nvme-over-pcie-non-volatile-memory-express" class="sidebar-link">==7. NVMe over PCIe (Non-Volatile Memory Express)==</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_8-sata-serial-ata" class="sidebar-link">==8. SATA (Serial ATA)==</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_9-pata-parallel-ata-ide" class="sidebar-link">9. PATA (Parallel ATA / IDE)</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_10-cfi-common-flash-interface" class="sidebar-link">10. CFI (Common Flash Interface)</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_11-lba-nand-logical-block-addressing-nand" class="sidebar-link">11. LBA-NAND (Logical Block Addressing NAND)</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_4-什么是-small-block" class="sidebar-link">4. 什么是 Small Block？</a></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_5-什么是-copy-back-编程" class="sidebar-link">5. 什么是“Copy-back”编程？</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#工作原理" class="sidebar-link">工作原理：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#应用场景" class="sidebar-link">应用场景：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#copy-back-编程的优点" class="sidebar-link">Copy-back 编程的优点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#copy-back-编程的局限" class="sidebar-link">Copy-back 编程的局限：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_6-什么是-multi-plane-编程" class="sidebar-link">6. 什么是“Multi-Plane”编程？</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#基本概念" class="sidebar-link">基本概念：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#工作原理-2" class="sidebar-link">工作原理：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#要求和限制" class="sidebar-link">要求和限制：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#multi-plane-编程的优点" class="sidebar-link">Multi-Plane 编程的优点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#multi-plane-编程的缺点和挑战" class="sidebar-link">Multi-Plane 编程的缺点和挑战：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#应用场景-2" class="sidebar-link">应用场景：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_7-什么是-interleave-编程" class="sidebar-link">7. 什么是“Interleave”编程？</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#工作原理-3" class="sidebar-link">工作原理：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#interleave-编程的特点" class="sidebar-link">Interleave 编程的特点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#与-multi-plane-编程的区别" class="sidebar-link">与 Multi-Plane 编程的区别：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#interleave-编程的优点" class="sidebar-link">Interleave 编程的优点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#interleave-编程的挑战" class="sidebar-link">Interleave 编程的挑战：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#应用场景-3" class="sidebar-link">应用场景：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-2" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_8-什么是-cache-编程" class="sidebar-link">8. 什么是“Cache”编程？</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#基本原理" class="sidebar-link">基本原理：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#cache-编程的主要特点" class="sidebar-link">Cache 编程的主要特点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#cache-编程的优点" class="sidebar-link">Cache 编程的优点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#cache-编程的局限" class="sidebar-link">Cache 编程的局限：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#cache-编程的应用场景" class="sidebar-link">Cache 编程的应用场景：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#cache-编程与普通编程的对比" class="sidebar-link">Cache 编程与普通编程的对比：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-3" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_9-描述-wordline-编程" class="sidebar-link">9. 描述“WordLine”编程</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#基本概念-2" class="sidebar-link">基本概念：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#工作原理-4" class="sidebar-link">工作原理：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#特点" class="sidebar-link">特点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#wordline-编程的优点" class="sidebar-link">WordLine 编程的优点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#wordline-编程的挑战" class="sidebar-link">WordLine 编程的挑战：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-4" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_10-简述带列地址编程" class="sidebar-link">10. 简述带列地址编程</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#关键概念" class="sidebar-link">关键概念：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#带列地址编程的工作原理" class="sidebar-link">带列地址编程的工作原理：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#带列地址编程的应用场景" class="sidebar-link">带列地址编程的应用场景：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#优点" class="sidebar-link">优点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#缺点" class="sidebar-link">缺点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-5" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_11-简述-ddr-编程" class="sidebar-link">11. 简述 DDR 编程</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#关键概念-2" class="sidebar-link">关键概念：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#ddr-编程的工作原理" class="sidebar-link">DDR 编程的工作原理：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#ddr-编程的优点" class="sidebar-link">DDR 编程的优点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#ddr-编程的应用场景" class="sidebar-link">DDR 编程的应用场景：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#ddr-编程的挑战" class="sidebar-link">DDR 编程的挑战：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-6" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_12-什么是-open-block" class="sidebar-link">12. 什么是“Open Block”？</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#关键概念-3" class="sidebar-link">关键概念：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#open-block-的特点" class="sidebar-link">Open Block 的特点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#open-block-的应用场景" class="sidebar-link">Open Block 的应用场景：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-7" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_13-简述什么是-readretry" class="sidebar-link">13. 简述什么是“ReadRetry“</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#关键概念-4" class="sidebar-link">关键概念：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#read-retry-的工作原理" class="sidebar-link">Read Retry 的工作原理：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#read-retry-的优点" class="sidebar-link">Read Retry 的优点：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#read-retry-的局限性" class="sidebar-link">Read Retry 的局限性：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#read-retry-的应用场景" class="sidebar-link">Read Retry 的应用场景：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-8" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_14-什么是-shared-page-groupe-page-对-flash-有什么影响" class="sidebar-link">14. 什么是 Shared Page/Groupe Page，对 Flash 有什么影响？</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#shared-page-group-page-的概念" class="sidebar-link">Shared Page / Group Page 的概念：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#flash-中的影响" class="sidebar-link">Flash 中的影响：</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_1-编程限制" class="sidebar-link">1. 编程限制：</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_2-读取干扰" class="sidebar-link">2. 读取干扰：</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_3-性能影响" class="sidebar-link">3. 性能影响：</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_4-存储密度" class="sidebar-link">4. 存储密度：</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_5-可靠性与数据恢复" class="sidebar-link">5. 可靠性与数据恢复：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-9" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_15-简述-toggle-和-onfi-的主要差异" class="sidebar-link">15. 简述 Toggle 和 ONFI 的主要差异</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_1-标准来源" class="sidebar-link">1. 标准来源：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_2-信号时钟机制" class="sidebar-link">2. 信号时钟机制：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_3-数据传输模式" class="sidebar-link">3. 数据传输模式：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_4-传输速率" class="sidebar-link">4. 传输速率：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_5-引脚与兼容性" class="sidebar-link">5. 引脚与兼容性：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_6-能效" class="sidebar-link">6. 能效：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_7-时钟管理和复杂性" class="sidebar-link">7. 时钟管理和复杂性：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#_8-市场应用" class="sidebar-link">8. 市场应用：</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-10" class="sidebar-link">总结：</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/16f0ba/#_16-描述常见的-flash-的编程、读的操作命令" class="sidebar-link">16. 描述常见的 Flash 的编程、读的操作命令</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#一、编程操作命令" class="sidebar-link">一、编程操作命令</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_1-页编程-page-program" class="sidebar-link">1. 页编程（Page Program）</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_2-copy-back-编程" class="sidebar-link">2. Copy-back 编程</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_3-multi-plane-编程" class="sidebar-link">3. Multi-Plane 编程</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#二、读取操作命令" class="sidebar-link">二、读取操作命令</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_1-标准页读取-page-read" class="sidebar-link">1. 标准页读取（Page Read）</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_2-cache-读取-cache-read" class="sidebar-link">2. Cache 读取（Cache Read）</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_3-multi-plane-读取" class="sidebar-link">3. Multi-Plane 读取</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_4-随机数据读取-random-data-read" class="sidebar-link">4. 随机数据读取（Random Data Read）</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#三、其他常见的操作命令" class="sidebar-link">三、其他常见的操作命令</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_1-块擦除-block-erase" class="sidebar-link">1. 块擦除（Block Erase）</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_2-读状态寄存器-read-status-register" class="sidebar-link">2. 读状态寄存器（Read Status Register）</a></li><li class="sidebar-sub-header level4"><a href="/pages/16f0ba/#_3-读设备-id-read-id" class="sidebar-link">3. 读设备 ID（Read ID）</a></li><li class="sidebar-sub-header level3"><a href="/pages/16f0ba/#总结-11" class="sidebar-link">总结：</a></li></ul></li></ul></li><li><a href="/pages/90d8d0/" class="sidebar-link">基于PA算法的FTL引导</a></li><li><a href="/pages/eb672b/" class="sidebar-link">SD 逻辑擦除和物理擦除</a></li><li><a href="/pages/747121/" class="sidebar-link">NAND Flash 的 SDR、ONFI、DDR 接口</a></li><li><a href="/pages/1eb351/" class="sidebar-link">【详解】Nand Flash 必看知识 1</a></li><li><a href="/pages/d2512a/" class="sidebar-link">【两万字详解】Nand Flash 必看知识</a></li></ul> </aside> <div><main class="page"><div class="theme-vdoing-wrapper "><div class="articleInfo-wrap" data-v-06225672><div class="articleInfo" data-v-06225672><ul class="breadcrumbs" data-v-06225672><li data-v-06225672><a href="/" title="首页" class="iconfont icon-home router-link-active" data-v-06225672></a></li> <li data-v-06225672><span data-v-06225672>闪存</span></li></ul> <div class="info" data-v-06225672><div title="作者" class="author iconfont icon-touxiang" data-v-06225672><a href="javascript:;" data-v-06225672>霜晨月</a></div> <div title="创建时间" class="date iconfont icon-riqi" data-v-06225672><a href="javascript:;" data-v-06225672>2025-07-09</a></div> <!----></div></div></div> <!----> <div class="content-wrapper"><div class="right-menu-wrapper"><div class="right-menu-margin"><div class="right-menu-title">目录</div> <div class="right-menu-content"></div></div></div> <h1><img src="">Nand Flash 基础<!----></h1> <!----> <div class="theme-vdoing-content content__default"><h1 id="nand-flash-基础"><a href="#nand-flash-基础" class="header-anchor">#</a> Nand Flash 基础</h1> <h2 id="_1-什么是-slc、mlc、tlc-各有什么特点"><a href="#_1-什么是-slc、mlc、tlc-各有什么特点" class="header-anchor">#</a> 1. 什么是 SLC、MLC、TLC，各有什么特点？</h2> <ul><li><strong>SLC（single-Level-Cell，单层存储单元）：</strong> 一单元空间（cell）可以存储 1bit 数据，也就是 1bit/cell ，单颗粒理论擦写次数在 10万 次以上。SLC 闪存具有最高的性能、耐用性和可靠性，因为每个存储单元只存储一个位，所以SLC闪存的读写速度较快，并且具有更长的使用寿命。它的问题是存储成本高，通常用于对性能和可靠性要求极高的应用，如企业级存储系统和嵌入式系统。</li> <li><strong>MLC（Multi-Level-Cell，双层存储单元）：</strong> 一单元空间（cell）可以存储 2bit 数据，也就是 2bit/cell，单颗粒理论擦写次数在 3000-5000 次左右。MLC 闪存的性能、耐用性和可靠性略低于 SLC，但比 TLC、QLC 更好，因为每个存储单元可以存储两个位，所以存储密度较高，相对于 SLC 仍然具有不错的性能和寿命，通常用于消费级 SSD 和一般应用。</li> <li><strong>TLC（Triple-Level-Cell，三层存储单元）：</strong> 一单元空间（cell）可以存储 3bit 数据，也就是 3bit/cell，单颗粒理论擦写次数在 500-3000 次左右。TLC 闪存的性能、耐用性和可靠性较低，因为每个存储单元存储三个位，使得存储成本更低，但是同时也降低了读写速度和寿命，容量是 SLC 的3倍、MLC 的1.5倍。TLC 闪存通常用于高容量消费级 SSD。</li> <li><strong>QLC（Quad-Level-Cell，四层存储单元）：</strong> 一单元空间（cell）可以存储 4bit 数据，也就是 4bit/cell，单颗粒理论上擦写次数仅为 100-300 次左右。QLC 闪存的性能、耐用性和可靠性最低，因为每个存储单元存储四个位，使用存储密度达到最高，但是同时读写速度和寿命都相对较低，所以存储成本也就是这些颗粒类型里最低的。QLC 闪存通常用于高容量消费级 SSD 和部分企业级应用，目前绝大部分定位低端的固态硬盘都采用的这个颗粒类型。</li></ul> <h2 id="_2-描述-flash-的基本结构-lun、die、plane、block、page"><a href="#_2-描述-flash-的基本结构-lun、die、plane、block、page" class="header-anchor">#</a> 2.  描述 Flash 的基本结构？（LUN、Die、Plane、Block、Page）</h2> <ul><li><strong>LUN（逻辑单元，Logical Unit Number）</strong>： LUN 是 Flash 存储器中逻辑单元的表示，它可以包含一个或多个 Die。每个 LUN 可以独立地进行操作，如读取、写入和擦除。多个 LUN 可以并行操作，以提高吞吐量。</li> <li><strong>Die（晶粒）</strong>： Die 是构成 Flash 存储芯片的基本物理单元，每个 Die 都可以单独操作。通常，多个 Die 集成在一个封装中。一个 Die 由多个 Plane 组成，可以看作 Flash 存储的主要工作单元。</li> <li><strong>平面（Plane）</strong>： Plane 是 Die 内部的一个区域，拥有独立的 Page 寄存器，包含多个 Block，通常 Flash 每个 Die 有两个或更多 Plane。Plane 允许在内部并行进行操作，比如在一个 Plane 进行读操作的同时，另一个 Plane 进行写操作，以提高性能。</li> <li><strong>块（Block）</strong>： Block 是 Flash 存储器中的最小擦除单元。每个 Block 包含多个 Page，可以通过编程来写入，但擦除时必须一次性擦除整个 Block。常见的 NAND Flash Block 大小在 64 KB 到几 MB 之间。写入数据时只能在空的 Page 上进行，而擦除操作则针对整个 Block。</li> <li><strong>页（Page）</strong>： Page 是 Flash 存储器的最小编程单元，也是最小的读取单元。每个 Page 包含的数据通常为 512 字节到 16 KB 不等，此外还有少量的 OOB（Out-Of-Band）空间，用于存储错误校正码（ECC）或其他元数据。在 NAND Flash 中，数据写入是按页进行的，而读写操作通常基于页级别。</li></ul> <h2 id="_3-常见的-nandflash-有哪几种接口"><a href="#_3-常见的-nandflash-有哪几种接口" class="header-anchor">#</a> 3.  常见的 NandFlash 有哪几种接口？</h2> <h3 id="_1-parallel-nand-并行-nand-接口"><a href="#_1-parallel-nand-并行-nand-接口" class="header-anchor">#</a> 1. <strong>Parallel NAND (并行 NAND 接口)</strong></h3> <ul><li>特性：
<ul><li>最早使用的接口，使用 8 位或 16 位的数据总线进行并行传输。</li> <li>包含多个控制引脚，如 <code>CLE</code> (Command Latch Enable)，<code>ALE</code> (Address Latch Enable)，<code>WE#</code> (Write Enable)，<code>RE#</code> (Read Enable) 等。</li> <li>需要较复杂的控制器来管理 NAND Flash。</li> <li>支持大容量 NAND Flash 存储。</li> <li>高数据带宽，适用于大容量存储器和嵌入式系统。</li></ul></li> <li><strong>典型应用</strong>：嵌入式系统、大型存储设备、移动设备等。</li></ul> <h3 id="_2-serial-nand-串行-nand-接口"><a href="#_2-serial-nand-串行-nand-接口" class="header-anchor">#</a> 2. <strong>Serial NAND (串行 NAND 接口)</strong></h3> <ul><li>特性：
<ul><li>使用串行数据传输方式，通常基于 <strong>SPI</strong> (Serial Peripheral Interface) 协议。</li> <li>通常只需要少量引脚，如 <code>SCLK</code> (串行时钟)，<code>MOSI</code> (主出从入)，<code>MISO</code> (主入从出)，<code>CS#</code> (片选)。</li> <li>数据传输速度较低，但引脚数量少、硬件复杂度低，适合小型嵌入式系统。</li></ul></li> <li><strong>典型应用</strong>：低功耗嵌入式系统，物联网 (IoT) 设备，工业设备等。</li></ul> <h3 id="_3-emmc-embedded-multimediacard"><a href="#_3-emmc-embedded-multimediacard" class="header-anchor">#</a> ==3. <strong>eMMC (embedded MultiMediaCard)</strong>==</h3> <ul><li>特性：
<ul><li>集成了 NAND Flash 和控制器芯片在同一封装内，主机无需直接管理 NAND Flash。</li> <li>使用标准化的 MMC 协议，数据通过命令和数据引脚进行传输。</li> <li>提供简化的设计，减少对主机的复杂度。</li> <li>支持较高的存储容量和较快的传输速度。</li></ul></li> <li><strong>典型应用</strong>：智能手机、平板电脑、消费电子设备、便携式设备。</li></ul> <h3 id="_4-ufs-universal-flash-storage"><a href="#_4-ufs-universal-flash-storage" class="header-anchor">#</a> ==4. <strong>UFS (Universal Flash Storage)</strong>==</h3> <ul><li>特性：
<ul><li>高速串行接口，支持全双工通信（可以同时进行读写操作）。</li> <li>基于 MIPI（移动产业处理器接口）联盟的标准，通常用于高端设备。</li> <li>提供比 eMMC 更快的数据传输速度，支持更大容量和更复杂的并发操作。</li> <li>使用 LVDS（低压差分信号）进行通信，减少信号干扰。</li></ul></li> <li><strong>典型应用</strong>：高端智能手机、平板电脑、SSD、汽车电子等。</li></ul> <h3 id="_5-onfi-open-nand-flash-interface"><a href="#_5-onfi-open-nand-flash-interface" class="header-anchor">#</a> ==5. <strong>ONFi (Open NAND Flash Interface)</strong>==</h3> <ul><li>特性：
<ul><li>由 ONFi 组织（包括英特尔、东芝等公司）制定的开放标准，用于 NAND Flash 的规范化接口。</li> <li>提供<strong>并行传输</strong>方式，类似 Parallel NAND，但采用了标准化的电气规范和协议。</li> <li><strong>支持异步和同步传输模式，数据传输效率更高。</strong></li> <li>提供版本升级（如 ONFi 1.0, 2.0, 3.0, 4.0 等），每个版本都提升了性能和兼容性。</li></ul></li> <li><strong>典型应用</strong>：固态硬盘 (SSD)、嵌入式设备、服务器存储等。</li></ul> <h3 id="_6-toggle-nand-toggle-mode-nand"><a href="#_6-toggle-nand-toggle-mode-nand" class="header-anchor">#</a> ==6. <strong>Toggle NAND (Toggle-Mode NAND)</strong>==</h3> <ul><li>特性：
<ul><li>由三星主导的一种<strong>高速 NAND 接口</strong>，采用 Toggle 模式。</li> <li>与 ONFi 类似的<strong>并行接口</strong>，但具有不同的电气和传输机制。</li> <li><strong>在不使用时钟信号的情况下，进行异步数据传输，提供高性能数据读写。</strong></li> <li>Toggle NAND 逐渐成为高端 NAND Flash 存储的主流接口。</li></ul></li> <li><strong>典型应用</strong>：高性能 SSD、服务器存储、数据中心等。</li></ul> <h3 id="_7-nvme-over-pcie-non-volatile-memory-express"><a href="#_7-nvme-over-pcie-non-volatile-memory-express" class="header-anchor">#</a> ==7. <strong>NVMe over PCIe (Non-Volatile Memory Express)</strong>==</h3> <ul><li>特性：
<ul><li>使用 PCIe 总线实现高速数据传输，适用于高性能存储设备。</li> <li>NVMe 是为固态存储设备设计的协议，专为 NAND Flash 优化，提供低延迟和高吞吐量。</li> <li>使用分层命令队列和并发处理来提高性能，尤其适合 SSD。</li></ul></li> <li><strong>典型应用</strong>：固态硬盘 (SSD)、数据中心、高端计算设备等。</li></ul> <h3 id="_8-sata-serial-ata"><a href="#_8-sata-serial-ata" class="header-anchor">#</a> ==8. <strong>SATA (Serial ATA)</strong>==</h3> <ul><li>特性：
<ul><li>一种串行接口，最早用于机械硬盘，但随着 SSD 的普及，也被用于连接 NAND Flash SSD。</li> <li>传输速度相对 NVMe 较慢，但在低成本系统中仍然广泛应用。</li> <li>提供稳定的传输协议和较广泛的兼容性。</li></ul></li> <li><strong>典型应用</strong>：消费级 SSD、笔记本电脑、桌面计算机等。</li></ul> <h3 id="_9-pata-parallel-ata-ide"><a href="#_9-pata-parallel-ata-ide" class="header-anchor">#</a> 9. <strong>PATA (Parallel ATA / IDE)</strong></h3> <ul><li>特性：
<ul><li>传统的硬盘接口，使用并行传输方式，较老的存储设备中使用。</li> <li>虽然 PATA 不再广泛应用于现代 NAND Flash，但一些早期的 NAND SSD 可能使用这种接口。</li></ul></li> <li><strong>典型应用</strong>：老式硬盘、早期的 SSD。</li></ul> <h3 id="_10-cfi-common-flash-interface"><a href="#_10-cfi-common-flash-interface" class="header-anchor">#</a> 10. <strong>CFI (Common Flash Interface)</strong></h3> <ul><li>特性：
<ul><li>一种用于 NOR Flash 的标准化接口，但在一些混合存储系统中也用于 NAND Flash。</li> <li>定义了标准化的命令集和数据传输协议，使不同厂商的 Flash 芯片互相兼容。</li></ul></li> <li><strong>典型应用</strong>：嵌入式设备、消费类电子产品。</li></ul> <h3 id="_11-lba-nand-logical-block-addressing-nand"><a href="#_11-lba-nand-logical-block-addressing-nand" class="header-anchor">#</a> 11. <strong>LBA-NAND (Logical Block Addressing NAND)</strong></h3> <ul><li>特性：
<ul><li>提供类似于硬盘的 LBA (逻辑块寻址) 模式，使得 NAND Flash 操作更接近于传统硬盘设备。</li> <li>通过控制器提供复杂的 NAND Flash 管理和错误校正，简化主机端操作。</li></ul></li> <li><strong>典型应用</strong>：嵌入式系统、工业设备等。</li></ul> <h2 id="_4-什么是-small-block"><a href="#_4-什么是-small-block" class="header-anchor">#</a> 4. 什么是 Small Block？</h2> <p><strong>Small Block</strong> 是 NAND Flash 中一种较早期的存储结构，通常指的是每个块（Block）较小的 NAND Flash 芯片。</p> <p>在 Small Block NAND Flash 中，<strong>Block</strong> 和 <strong>Page</strong> 的大小较小，具体特征如下：</p> <ol><li><p><strong>Block 大小</strong>：
Small Block NAND 的每个块通常包含 <strong>32 个页</strong>，每个页的大小一般为 <strong>512 字节</strong>。因此，Block 的总大小为 <strong>16 KB</strong>。</p></li> <li><p><strong>Page 大小</strong>：
每个 Page 通常为 <strong>512 字节</strong>，并且还附带一些额外的 <strong>OOB（Out-Of-Band）</strong> 空间，通常为 <strong>16 字节</strong>，用于存储错误校正码（ECC）、坏块标记、以及其他元数据。</p></li> <li><p><strong>应用场景</strong>：
Small Block NAND Flash 主要用于早期的嵌入式系统或小容量存储设备中，由于其容量相对较低，适合那些对存储需求较小的应用。例如早期的 USB 闪存、移动设备、以及一些嵌入式设备。</p></li> <li><p><strong>与 Large Block 的区别</strong>：
与之相对的是 <strong>Large Block</strong> NAND Flash，后者每个 Block 包含更多页（64 页或更多），而且每个页的大小也更大（通常为 2 KB、4 KB 或更大），因此 Large Block 的总容量要远远大于 Small Block。</p></li></ol> <p><strong>Small Block</strong> 的主要优势是适合早期小型设备和低容量需求的应用，但随着 NAND Flash 容量的增大以及性能需求的提高，Large Block 和其他更现代化的结构逐渐取代了 Small Block NAND Flash。</p> <h2 id="_5-什么是-copy-back-编程"><a href="#_5-什么是-copy-back-编程" class="header-anchor">#</a> 5. 什么是“Copy-back”编程？</h2> <p><strong>“Copy-back” 编程</strong> 是 NAND Flash 操作中的一种特殊功能，用于在无需经过主机系统的情况下，将数据从一个 Page（页）复制到另一个 Page。这种操作可以提高效率并减少主机与 NAND Flash 之间的传输负担。</p> <h3 id="工作原理"><a href="#工作原理" class="header-anchor">#</a> 工作原理：</h3> <p>通常，在对 NAND Flash 进行数据搬移时，标准过程是将数据从源 Page 读取到主机，再由主机将数据写回目标 Page。这个过程涉及两次数据传输：从 NAND Flash 到主机，再从主机返回到 NAND Flash。</p> <p>而在 <strong>Copy-back</strong> 编程中，NAND Flash 控制器直接将数据从源 Page 复制到目标 Page，而不通过主机进行中转。其操作步骤通常如下：</p> <ol><li><strong>读取源 Page 数据</strong>：NAND Flash 控制器将源 Page 的数据加载到内部缓存中。</li> <li><strong>写入目标 Page</strong>：NAND Flash 直接将缓存中的数据写入目标 Page。</li></ol> <p>这种方法避免了主机参与数据传输，减少了 I/O 带宽的使用，从而提高了操作效率。</p> <h3 id="应用场景"><a href="#应用场景" class="header-anchor">#</a> 应用场景：</h3> <p>Copy-back 编程通常用于以下场景：</p> <ol><li><strong>坏块管理</strong>：当 NAND Flash 中的某些块检测到坏块时，可以使用 Copy-back 编程将数据从受影响的块复制到一个健康的块中。</li> <li><strong>数据搬移</strong>：当某些块频繁擦写时，可能需要将数据搬移到其他区域，延长块的寿命。此时可以使用 Copy-back 编程将数据从旧块快速搬移到新块。</li></ol> <h3 id="copy-back-编程的优点"><a href="#copy-back-编程的优点" class="header-anchor">#</a> Copy-back 编程的优点：</h3> <ol><li><strong>减少数据传输</strong>：避免了主机与 NAND Flash 之间的数据搬移，降低了 I/O 带宽使用率。</li> <li><strong>提高性能</strong>：减少了主机参与的等待时间，提升了整体数据搬移的速度。</li> <li><strong>降低功耗</strong>：因为主机无需处理数据传输，整个过程的功耗也较低。</li></ol> <h3 id="copy-back-编程的局限"><a href="#copy-back-编程的局限" class="header-anchor">#</a> Copy-back 编程的局限：</h3> <ol><li><strong>错误传播风险</strong>：由于数据直接从源 Page 复制到目标 Page，如果源 Page 中的数据存在错误（例如未被检测到的位翻转错误），这些错误会在目标 Page 中复制，导致潜在的数据完整性问题。</li> <li><strong>数据可靠性</strong>：Copy-back 编程过程中，如果没有适当的 ECC（错误校正码）机制，可能导致数据错误未被纠正，从而影响 NAND Flash 的可靠性。</li></ol> <p>总的来说，<strong>Copy-back</strong> 编程是优化 NAND Flash 数据搬移和管理的一种有效方式，尤其在需要高效率进行数据复制的场景下，但在实现时需要确保良好的数据校验机制，以防止错误的传播。</p> <h2 id="_6-什么是-multi-plane-编程"><a href="#_6-什么是-multi-plane-编程" class="header-anchor">#</a> 6. 什么是“Multi-Plane”编程？</h2> <p><strong>Multi-Plane 编程</strong> 是 NAND Flash 中的一种高效写操作技术，允许同时对多个 <strong>Plane</strong> 执行编程（写入）操作，从而提高数据写入速度和整体性能。</p> <h3 id="基本概念"><a href="#基本概念" class="header-anchor">#</a> 基本概念：</h3> <p>在 NAND Flash 中，每个 <strong>Die</strong>（晶粒）通常分为多个 <strong>Plane</strong>（平面），每个 Plane 又包含多个 <strong>Block</strong> 和 <strong>Page</strong>。标准的编程操作只能在一个 Plane 中的 Page 执行，即一次只能对一个 Plane 写入数据。而 <strong>Multi-Plane 编程</strong> 则允许同时对多个 Plane 的 Page 执行编程操作。</p> <h3 id="工作原理-2"><a href="#工作原理-2" class="header-anchor">#</a> 工作原理：</h3> <p>Multi-Plane 编程利用 NAND Flash 中的多个 Plane，并将相同的写入命令分配给不同 Plane 中对应的 Page。每个 Plane 会执行相同的操作（例如写入数据），但操作是并行的。因此，可以在一个时钟周期内同时对多个 Plane 进行编程。</p> <p>例如：</p> <ul><li>如果 NAND Flash 具有两个 Plane，普通编程操作一次只能向一个 Plane 写入数据；</li> <li>使用 Multi-Plane 编程时，可以在相同的时间内同时向两个 Plane 写入数据，大幅提高写入效率。</li></ul> <h3 id="要求和限制"><a href="#要求和限制" class="header-anchor">#</a> 要求和限制：</h3> <ul><li><strong>Page 对齐</strong>：Multi-Plane 编程要求所编程的 Page 在多个 Plane 之间必须是对齐的。例如，如果要对 Plane 0 的第 5 个 Page 进行写操作，那么 Plane 1 的第 5 个 Page 也必须同时写入数据。不能跨越 Plane 或选择不同的 Page。</li> <li><strong>数据一致性</strong>：通常要求写入的数据在多个 Plane 中一致，即每个 Plane 内的 Page 数据结构相同，这样可以保证写入的同步性。</li> <li><strong>ECC 校验</strong>：由于多个 Plane 同时编程，系统在处理错误检测和纠正时必须确保所有 Plane 中的数据一致，ECC（错误校正码）机制必须适应 Multi-Plane 编程的特性。</li></ul> <h3 id="multi-plane-编程的优点"><a href="#multi-plane-编程的优点" class="header-anchor">#</a> Multi-Plane 编程的优点：</h3> <ol><li><strong>提高写入速度</strong>：通过并行编程多个 Plane，显著提高了 NAND Flash 的数据写入速度。</li> <li><strong>提升系统效率</strong>：减少了主机和 NAND Flash 之间的数据传输次数，降低了 I/O 带宽的消耗。</li> <li><strong>提高吞吐量</strong>：系统可以在相同时间内写入更多数据，从而增加了整体数据吞吐量。</li></ol> <h3 id="multi-plane-编程的缺点和挑战"><a href="#multi-plane-编程的缺点和挑战" class="header-anchor">#</a> Multi-Plane 编程的缺点和挑战：</h3> <ol><li><strong>编程复杂性</strong>：与单 Plane 编程相比，Multi-Plane 编程操作更加复杂，需要 NAND 控制器支持同步管理多个 Plane 的操作。</li> <li><strong>Page 对齐限制</strong>：由于必须对齐 Plane 中的 Page，因此在某些场景下可能无法完全利用 Multi-Plane 编程的优势，尤其是在非对齐写入时。</li> <li><strong>错误传播风险</strong>：在多个 Plane 同时写入数据时，如果其中一个 Plane 发生编程错误，可能会导致整个写入操作失败或数据丢失，因此需要有效的 ECC 机制来减少这种风险。</li></ol> <h3 id="应用场景-2"><a href="#应用场景-2" class="header-anchor">#</a> 应用场景：</h3> <ul><li><strong>高性能存储设备</strong>：如 SSD（固态硬盘），需要频繁地进行大数据量的写操作，Multi-Plane 编程能够极大提升数据写入的效率。</li> <li><strong>嵌入式系统</strong>：在对性能要求较高的嵌入式系统中，Multi-Plane 编程可以有效减少写操作的时间，提升整体系统响应速度。</li></ul> <h3 id="总结"><a href="#总结" class="header-anchor">#</a> 总结：</h3> <p><strong>Multi-Plane 编程</strong> 是一种优化 NAND Flash 写入速度的技术，通过同时对多个 Plane 进行编程操作，可以提高数据传输效率和存储设备的整体性能。在高性能应用场景中，如 SSD 和嵌入式系统，它能够显著提升写入吞吐量，但其实现要求硬件和控制器具备更复杂的同步和错误校验机制。</p> <h2 id="_7-什么是-interleave-编程"><a href="#_7-什么是-interleave-编程" class="header-anchor">#</a> 7. 什么是“Interleave”编程？</h2> <p><strong>Interleave 编程</strong> 是一种用于 NAND Flash 的技术，通过在同一 NAND Die（晶粒）内的多个 LUN（逻辑单元）间交替执行编程操作，以提高数据写入速度和系统性能。与 <strong>Multi-Plane 编程</strong> 类似，它的目标是并行化操作，但它的作用对象是多个 LUN，而非多个 Plane。</p> <h3 id="工作原理-3"><a href="#工作原理-3" class="header-anchor">#</a> 工作原理：</h3> <p>在 NAND Flash 中，每个 Die 可以包含多个 LUN，每个 LUN 是一个相对独立的存储单元，可以执行读写操作。<strong>Interleave 编程</strong> 通过让两个或多个 LUN 交替进行编程操作，使得在一个 LUN 执行编程操作的等待时间内，可以对另一个 LUN 进行数据编程，从而有效减少空闲时间并提高吞吐量。</p> <p>例如：</p> <ol><li>当 LUN 0 正在执行编程操作时，LUN 1 可以准备下一次操作，或开始执行它自己的编程任务。</li> <li>两个 LUN 交替进行操作时，系统不必等待单个 LUN 编程完成才能进行下一个操作，从而提高写入速度。</li></ol> <h3 id="interleave-编程的特点"><a href="#interleave-编程的特点" class="header-anchor">#</a> Interleave 编程的特点：</h3> <ol><li><strong>多个 LUN 交替执行</strong>：在同一个 Die 中的多个 LUN 交替进行编程操作，可以减少操作之间的等待时间。</li> <li><strong>提高并行性</strong>：虽然每个 LUN 的编程速度不会改变，但多个 LUN 的交替编程大大提高了整体的并行性，增加了数据吞吐量。</li> <li><strong>减少延迟</strong>：由于可以利用等待时间来对另一个 LUN 进行操作，减少了因为单一 LUN 操作时的等待时间，从而降低延迟。</li></ol> <h3 id="与-multi-plane-编程的区别"><a href="#与-multi-plane-编程的区别" class="header-anchor">#</a> 与 Multi-Plane 编程的区别：</h3> <ul><li><p><strong>操作对象不同</strong>：</p> <ul><li><strong>Multi-Plane 编程</strong> 是在同一个 LUN 的多个 Plane 中同时执行编程操作。</li> <li><strong>Interleave 编程</strong> 是在同一个 Die 内的多个 LUN 之间交替执行操作。</li></ul></li> <li><p><strong>并行方式不同</strong>：</p> <ul><li>Multi-Plane 编程是并行对齐的 Plane 操作，而 Interleave 编程是交替的 LUN 操作，减少了等待时间。</li></ul></li></ul> <h3 id="interleave-编程的优点"><a href="#interleave-编程的优点" class="header-anchor">#</a> Interleave 编程的优点：</h3> <ol><li><strong>提高性能</strong>：通过多 LUN 交替编程，可以减少编程延迟，提高整体写入性能。</li> <li><strong>增加吞吐量</strong>：多个 LUN 的交替操作让系统能够在更短的时间内处理更多数据，从而提升了吞吐量。</li> <li><strong>降低功耗</strong>：由于减少了操作的空闲时间，整体功耗可能会降低，特别是在高性能需求的设备中。</li></ol> <h3 id="interleave-编程的挑战"><a href="#interleave-编程的挑战" class="header-anchor">#</a> Interleave 编程的挑战：</h3> <ol><li><strong>控制器复杂性</strong>：Interleave 编程需要 NAND 控制器能够有效管理多个 LUN 的并行编程，并确保操作不会互相干扰。</li> <li><strong>错误处理</strong>：多个 LUN 同时进行编程时，如果某个 LUN 出现编程错误或故障，控制器需要有能力进行错误检测和纠正，避免影响其他 LUN。</li> <li><strong>应用场景限制</strong>：虽然 Interleave 编程能有效提升性能，但其优化效果在高并发操作中更明显，低并发环境下的提升可能不显著。</li></ol> <h3 id="应用场景-3"><a href="#应用场景-3" class="header-anchor">#</a> 应用场景：</h3> <ul><li><strong>高性能存储设备</strong>：在如 SSD 等需要频繁、高速写入的设备中，Interleave 编程能够显著提升数据传输速度。</li> <li><strong>企业级存储</strong>：对于服务器或数据中心等需要处理大量并发写操作的场景，Interleave 编程可以提供更高的吞吐量和性能。</li> <li><strong>嵌入式系统</strong>：需要进行高效数据处理的嵌入式设备也可以从 Interleave 编程中受益。</li></ul> <h3 id="总结-2"><a href="#总结-2" class="header-anchor">#</a> 总结：</h3> <p><strong>Interleave 编程</strong> 是一种通过在多个 LUN 之间交替执行编程操作来提升 NAND Flash 写入性能的技术。它通过减少编程操作中的等待时间，提高了并行度和系统吞吐量，特别适用于需要高性能和高并发写入的存储设备。虽然控制器的设计会因此变得更复杂，但 Interleave 编程提供的性能提升在高性能存储设备中具有重要价值。</p> <h2 id="_8-什么是-cache-编程"><a href="#_8-什么是-cache-编程" class="header-anchor">#</a> 8. 什么是“Cache”编程？</h2> <p><strong>Cache 编程</strong> 是 NAND Flash 的一种高效编程模式，旨在通过缓存机制加速数据写入过程，减少写操作的等待时间，提高整体性能。它主要应用于大容量和高性能 NAND Flash 设备，比如 SSD（固态硬盘），用于提升数据的写入速度。</p> <h3 id="基本原理"><a href="#基本原理" class="header-anchor">#</a> 基本原理：</h3> <p>在标准的 NAND Flash 编程操作中，数据是按页（Page）写入的。通常，当一个页的写入操作尚未完成时，Flash 内部的存储器（或控制器）必须等待写操作结束，才能接受新的写入命令或数据。这种等待时间称为编程延迟，会降低写入的效率。</p> <p><strong>Cache 编程</strong> 通过引入一个高速缓存（Cache），使 NAND Flash 能够在完成当前页编程时，立即开始接受并缓存下一页的数据，从而有效减少主机和 Flash 控制器之间的空闲时间，提升数据吞吐量。具体步骤如下：</p> <ol><li><strong>主机传送数据到 NAND Flash</strong>：主机将数据传输到 NAND Flash 缓存区。</li> <li><strong>缓存数据写入 Page</strong>：NAND Flash 将缓存区的数据写入到 Flash 内存的某个 Page 上。</li> <li><strong>并行操作</strong>：当第一个 Page 的编程尚未完成时，主机可以继续传输下一页的数据，这些数据被缓存到 Cache 中，而不是等待之前的写入操作完成。</li></ol> <p>这种操作方式让 NAND Flash 控制器和主机之间能够保持连续的交互，不再需要等待每个页的编程完成。</p> <h3 id="cache-编程的主要特点"><a href="#cache-编程的主要特点" class="header-anchor">#</a> Cache 编程的主要特点：</h3> <ol><li><strong>并行化写入</strong>：通过缓存机制，可以在一个 Page 编程的同时，缓存下一页的数据，减少了主机的等待时间。</li> <li><strong>流水线操作</strong>：主机、缓存和 Flash 存储器之间形成流水线式操作，数据传输和写入操作重叠进行，提高了系统的吞吐量。</li> <li><strong>提升性能</strong>：Cache 编程显著减少了数据写入的延迟时间，尤其是在需要连续写入大数据量时，能够极大提升整体性能。</li></ol> <h3 id="cache-编程的优点"><a href="#cache-编程的优点" class="header-anchor">#</a> Cache 编程的优点：</h3> <ol><li><strong>减少等待时间</strong>：由于引入缓存，主机不必等待每个 Page 的写入操作完成，从而显著减少了写入的延迟时间。</li> <li><strong>提升写入速度</strong>：可以在 Page 写入过程中同时准备下一页的数据，增加了 NAND Flash 的写入效率，特别是对于连续大数据量写入的应用场景。</li> <li><strong>提高吞吐量</strong>：Cache 编程允许主机和 NAND Flash 控制器之间更流畅地交互，减少了闲置时间，提升了总的写入吞吐量。</li></ol> <h3 id="cache-编程的局限"><a href="#cache-编程的局限" class="header-anchor">#</a> Cache 编程的局限：</h3> <ol><li><strong>适用于大数据写入</strong>：Cache 编程的主要优势体现在连续的大数据量写入场景中。如果是随机小数据写入，优势并不明显。</li> <li><strong>数据一致性</strong>：由于数据是在缓存中临时保存的，如果在 Cache 编程过程中出现断电或系统故障，未写入 Flash 的数据可能会丢失。因此需要额外的机制（如电池备份或其他持久化方式）确保数据安全。</li> <li><strong>复杂性增加</strong>：控制器需要支持 Cache 操作，并在操作过程中有效管理数据缓存和写入，增加了 NAND Flash 控制器的设计复杂性。</li></ol> <h3 id="cache-编程的应用场景"><a href="#cache-编程的应用场景" class="header-anchor">#</a> Cache 编程的应用场景：</h3> <ul><li><strong>SSD 和高速存储设备</strong>：需要频繁和大数据量写入的场景，例如 SSD、企业级存储设备等，Cache 编程可以显著提升写入性能。</li> <li><strong>嵌入式系统</strong>：在某些嵌入式应用中，如果存在连续的数据写入需求，Cache 编程可以帮助提高系统响应和数据处理效率。</li> <li><strong>消费类存储设备</strong>：如 U 盘、SD 卡等，需要在有限时间内处理大文件时，也可以通过 Cache 编程提升写入速度。</li></ul> <h3 id="cache-编程与普通编程的对比"><a href="#cache-编程与普通编程的对比" class="header-anchor">#</a> Cache 编程与普通编程的对比：</h3> <ul><li><strong>普通编程</strong>：每次 Page 写入操作需要等待完成才能继续下一页的写入，整个过程是顺序的。</li> <li><strong>Cache 编程</strong>：通过缓存机制，可以在写入当前页的同时缓存下一页的数据，从而在流水线的操作下提高写入速度。</li></ul> <h3 id="总结-3"><a href="#总结-3" class="header-anchor">#</a> 总结：</h3> <p><strong>Cache 编程</strong> 是一种通过缓存机制加速 NAND Flash 写入的技术，尤其适用于大数据量和连续写入操作的场景。它通过减少写入操作中的等待时间，显著提高了 NAND Flash 的写入速度和系统性能，广泛应用于 SSD 等高性能存储设备中。然而，这种技术的实现要求 NAND Flash 控制器具备更复杂的缓存管理机制，并保证数据的完整性和一致性。</p> <h2 id="_9-描述-wordline-编程"><a href="#_9-描述-wordline-编程" class="header-anchor">#</a> 9. 描述“WordLine”编程</h2> <p><strong>WordLine 编程</strong> 是 NAND Flash 存储器中的一种编程方式，它的核心概念是同时对一整行的存储单元进行编程操作。这一行的存储单元共享同一根 <strong>WordLine</strong>（字线）。为了理解 WordLine 编程，我们首先需要了解 NAND Flash 的内部结构。</p> <h3 id="基本概念-2"><a href="#基本概念-2" class="header-anchor">#</a> 基本概念：</h3> <p>在 NAND Flash 中，存储单元（即存储数据的基本单元）被组织成多个 <strong>Page</strong>（页），每个 Page 由若干个存储单元组成。这些存储单元以矩阵的形式排列，其中：</p> <ul><li><strong>WordLine</strong> 是横向的导线，连接一行上的所有存储单元。</li> <li><strong>BitLine</strong> 是纵向的导线，连接同一列的存储单元。</li></ul> <p>一个 <strong>Page</strong> 通常由数千个存储单元组成，而这些存储单元由同一个 WordLine 控制。换句话说，编程一个 Page 的操作实际上是在编程与该 Page 对应的 <strong>WordLine</strong> 上的所有存储单元。</p> <h3 id="工作原理-4"><a href="#工作原理-4" class="header-anchor">#</a> 工作原理：</h3> <p>在 WordLine 编程中，控制器会同时对一整条 WordLine（即一个 Page）上的存储单元进行写入。具体过程如下：</p> <ol><li><strong>选择 WordLine</strong>：控制器选择要编程的 Page 的 WordLine。</li> <li><strong>加载数据</strong>：控制器将需要写入的数据加载到缓存中，这些数据对应于 WordLine 上的每个存储单元。</li> <li><strong>编程电压</strong>：控制器对选中的 WordLine 施加编程电压，同时控制相应的 <strong>BitLine</strong>，以确保在不同的存储单元中写入相应的数据。</li> <li><strong>数据写入</strong>：WordLine 上的所有存储单元同时进行电荷存储，以表示数据的“0”或“1”。</li></ol> <h3 id="特点"><a href="#特点" class="header-anchor">#</a> 特点：</h3> <ol><li><strong>并行操作</strong>：WordLine 编程是一种并行写入操作，它允许同时对一行中的多个存储单元进行编程，这与逐个单元写入的方式相比，能够显著提高数据写入速度。</li> <li><strong>Page 为单位</strong>：WordLine 编程以 Page 为单位执行，因此写入数据时通常以 Page 的大小进行操作。常见的 Page 大小为 2KB、4KB 或更大。</li> <li><strong>电荷存储</strong>：在浮栅型 NAND Flash 中，WordLine 编程的实质是对浮栅施加电荷，从而改变存储单元的阈值电压，以表示不同的数值。SLC（单层单元）、MLC（多层单元）和 TLC（三级单元）存储器中的存储单元可以存储 1 位、2 位或 3 位信息，这也会影响编程的复杂性。</li></ol> <h3 id="wordline-编程的优点"><a href="#wordline-编程的优点" class="header-anchor">#</a> WordLine 编程的优点：</h3> <ol><li><strong>高效并行性</strong>：由于 WordLine 编程可以同时操作多个存储单元，它比逐个单元的编程方式速度更快，特别是在大容量的 NAND Flash 中，能显著提高写入性能。</li> <li><strong>高数据吞吐量</strong>：由于一次操作可以处理一个 Page 的数据，WordLine 编程可以提供较高的数据写入吞吐量。</li> <li><strong>适用于大容量设备</strong>：现代大容量 NAND Flash 通常要求高效的写入操作，WordLine 编程能够满足大数据量的写入需求，适用于 SSD 等高性能存储设备。</li></ol> <h3 id="wordline-编程的挑战"><a href="#wordline-编程的挑战" class="header-anchor">#</a> WordLine 编程的挑战：</h3> <ol><li><strong>编程干扰</strong>：由于 WordLine 编程会同时对多个存储单元施加编程电压，可能会导致临近单元出现电压干扰，特别是在高密度 NAND Flash 中，如 TLC 和 QLC 存储器。这种干扰需要通过复杂的算法和 ECC（错误校正码）机制来纠正。</li> <li><strong>耗电量较高</strong>：同时对多个存储单元施加编程电压需要较大的电能，因此 WordLine 编程的功耗可能较高，特别是在并行写入多个 Plane 或 Die 的情况下。</li> <li><strong>编程时间</strong>：虽然 WordLine 编程可以并行写入数据，但编程一个完整的 Page 仍然需要一定的时间，特别是在高密度的 NAND Flash 中，编程时间可能会变长。</li></ol> <h3 id="总结-4"><a href="#总结-4" class="header-anchor">#</a> 总结：</h3> <p><strong>WordLine 编程</strong> 是 NAND Flash 中一种以 Page 为单位进行并行写入的技术，通过同时对一条 WordLine 上的所有存储单元进行编程，实现高效的数据写入操作。它在提高写入速度和提升数据吞吐量方面具有显著优势，但同时也面临如编程干扰等挑战。WordLine 编程在现代大容量、高性能 NAND Flash 存储设备中广泛应用，尤其是在需要处理大数据量的场景下（如 SSD）。</p> <h2 id="_10-简述带列地址编程"><a href="#_10-简述带列地址编程" class="header-anchor">#</a> 10. 简述带列地址编程</h2> <p><strong>带列地址编程</strong>（Column Address Programming）是 NAND Flash 编程中的一种方式，它允许通过指定列地址进行数据写入操作。与传统的页编程模式不同，带列地址编程的特点是在对页进行编程时，可以精确地指定数据写入的位置，即数据将写入哪个列（Column）中。这种方式在处理部分数据更新、修复错误数据等特定场景下非常有用。</p> <h3 id="关键概念"><a href="#关键概念" class="header-anchor">#</a> 关键概念：</h3> <ul><li><strong>列地址（Column Address）</strong>：NAND Flash 中的每个页（Page）由多个存储单元组成，这些存储单元按行（WordLine）和列（BitLine）排列。列地址是存储单元在页内的纵向位置。</li> <li><strong>页（Page）</strong>：通常是 NAND Flash 操作的最小写入单位，一个页包含多个列。常见的页大小为 2KB、4KB 或 8KB 等。</li> <li><strong>带列地址编程</strong>：在进行数据编程时，指定列地址以决定数据写入 NAND Flash 页的具体位置。相较于整页编程，带列地址编程更加灵活，可以只对特定部分进行修改，而无需擦除整个块。</li></ul> <h3 id="带列地址编程的工作原理"><a href="#带列地址编程的工作原理" class="header-anchor">#</a> 带列地址编程的工作原理：</h3> <ol><li><strong>选择页</strong>：首先，控制器选择要编程的页，这个页对应于某个 WordLine。</li> <li><strong>指定列地址</strong>：控制器接着指定列地址，确定数据将在这个页的哪一列开始写入。例如，指定列地址可以是页的某个偏移位置，表示从该偏移位置开始编程数据。</li> <li><strong>加载数据</strong>：根据列地址指定的数据位置，控制器将数据加载到 NAND Flash 中，并准备进行写入操作。</li> <li><strong>编程操作</strong>：数据被写入到指定列地址对应的存储单元中。与传统的整页编程相比，这种方式仅更新指定的列地址范围，而不影响页中的其他部分。</li></ol> <h3 id="带列地址编程的应用场景"><a href="#带列地址编程的应用场景" class="header-anchor">#</a> 带列地址编程的应用场景：</h3> <ol><li><strong>部分数据更新</strong>：在某些情况下，可能只需要更新页中的一部分数据，而不想影响到整个页。带列地址编程允许精确定位到需要更新的数据位置，无需重新编程整个页。</li> <li><strong>修复错误数据</strong>：如果某些数据在编程或读取过程中发生错误，可以通过带列地址编程的方式对这些错误数据进行局部修复，而不需要擦除并重写整个块。</li> <li><strong>数据随机写入</strong>：带列地址编程允许控制器在页内的任意位置写入数据，使得随机写入操作更加灵活，尤其是在一些嵌入式系统或特殊数据存储需求下非常有用。</li></ol> <h3 id="优点"><a href="#优点" class="header-anchor">#</a> 优点：</h3> <ol><li><strong>灵活性高</strong>：带列地址编程可以针对页的特定部分进行修改，而不影响其他列，适用于需要部分更新或随机写入的场景。</li> <li><strong>减少擦除次数</strong>：在 NAND Flash 中，编程操作通常要求在编写新数据之前先擦除整个块。通过带列地址编程，可以避免对整页进行擦除和重写，减少了擦除的频率，从而延长 NAND Flash 的寿命。</li> <li><strong>提高效率</strong>：对于小数据量的写入，带列地址编程可以避免不必要的整页编写，从而提高数据写入的效率。</li></ol> <h3 id="缺点"><a href="#缺点" class="header-anchor">#</a> 缺点：</h3> <ol><li><strong>复杂性增加</strong>：带列地址编程的实现需要更复杂的控制逻辑，尤其是在需要频繁部分更新的应用中，控制器必须精确管理每次写入的地址范围。</li> <li><strong>潜在数据冲突</strong>：由于 NAND Flash 的擦除-写入操作特性，如果不小心，带列地址编程可能导致数据的部分重写冲突，进而引发数据不一致的问题。</li></ol> <h3 id="总结-5"><a href="#总结-5" class="header-anchor">#</a> 总结：</h3> <p><strong>带列地址编程</strong> 是一种灵活的 NAND Flash 编程方式，允许在指定的列地址位置进行数据写入。这种技术特别适用于需要局部更新或随机写入的场景，可以减少对整个页或块的擦除与重写，提升操作效率，同时延长 NAND Flash 的寿命。不过，其复杂性也增加了控制器设计的难度，特别是在确保数据一致性和防止冲突时，需要更多的管理和控制。</p> <h2 id="_11-简述-ddr-编程"><a href="#_11-简述-ddr-编程" class="header-anchor">#</a> 11. 简述 DDR 编程</h2> <p><strong>DDR 编程</strong>（Double Data Rate Programming）是一种用于 NAND Flash 存储器中的数据传输和编程技术，旨在提高数据传输速率和整体性能。DDR 编程的核心原理是通过在时钟的上升沿和下降沿同时传输数据，从而实现双倍的数据传输速率。</p> <h3 id="关键概念-2"><a href="#关键概念-2" class="header-anchor">#</a> 关键概念：</h3> <ol><li><strong>DDR（Double Data Rate）</strong>：DDR 技术指的是在时钟信号的每一个周期内，数据在上升沿和下降沿都进行传输，这样在相同的时钟频率下，数据传输速率比传统的单数据速率（SDR）提升了一倍。</li> <li><strong>NAND Flash 编程</strong>：NAND Flash 编程通常包括数据的传输、写入和存储过程。在 DDR 模式下，数据传输到 NAND Flash 的速度加快，尤其适用于需要高带宽的存储系统。</li></ol> <h3 id="ddr-编程的工作原理"><a href="#ddr-编程的工作原理" class="header-anchor">#</a> DDR 编程的工作原理：</h3> <ol><li><p><strong>时钟双沿传输</strong>：在 DDR 模式下，控制器在每个时钟周期的上升沿和下降沿传输数据。例如，传统的 SDR 模式只在时钟的上升沿传输一次数据，而 DDR 模式则在上升沿和下降沿各传输一次数据，从而将数据传输速率提升了一倍。</p></li> <li><p><strong>命令和地址传输</strong>：与数据传输类似，命令和地址信息也可以在 DDR 模式下通过上升沿和下降沿进行传输，这使得整个编程过程更加高效。</p></li> <li><p><strong>数据缓存与编程</strong>：在 DDR 编程过程中，数据通常先被传输到 NAND Flash 的数据缓存中，然后再以页为单位编程到闪存单元中。DDR 技术加速了传输到缓存的速度，但编程 NAND Flash 单元本身的速度并未改变。<strong>因此，DDR 编程的主要提升体现在数据传输阶段。</strong></p></li></ol> <h3 id="ddr-编程的优点"><a href="#ddr-编程的优点" class="header-anchor">#</a> DDR 编程的优点：</h3> <ol><li><p><strong>数据传输速率提升</strong>：DDR 编程通过双沿传输，显著提高了数据的传输速率，使得整体编程速度加快。对于需要处理大量数据的场景（如固态硬盘、存储卡等），DDR 编程能有效提高设备的吞吐量和性能。</p></li> <li><p><strong>提高系统效率</strong>：DDR 模式下，命令、地址和数据的传输速度都加快，减少了数据传输瓶颈，提高了系统的整体效率，尤其是在需要频繁读写操作的应用中。</p></li> <li><p><strong>兼容性</strong>：DDR 编程通常在具有 DDR 接口的 NAND Flash 中实现，能够与支持 DDR 技术的控制器和主机系统兼容，广泛应用于高速存储设备中。</p></li></ol> <h3 id="ddr-编程的应用场景"><a href="#ddr-编程的应用场景" class="header-anchor">#</a> DDR 编程的应用场景：</h3> <ol><li><strong>高性能存储设备</strong>：如固态硬盘（SSD）、存储卡（如 UFS、eMMC）等存储设备，通过 DDR 编程提高读写速度，满足现代数据密集型应用的需求。</li> <li><strong>嵌入式系统</strong>：在嵌入式系统中，特别是需要快速存取数据的系统（如消费电子产品、工业设备），DDR 编程能够显著提升存储器的性能。</li> <li><strong>移动设备</strong>：智能手机、平板电脑等移动设备中的 NAND Flash 存储器通常采用 DDR 技术，以保证设备的高性能和快速响应能力。</li></ol> <h3 id="ddr-编程的挑战"><a href="#ddr-编程的挑战" class="header-anchor">#</a> DDR 编程的挑战：</h3> <ol><li><p><strong>复杂性增加</strong>：DDR 编程需要控制器与 NAND Flash 设备之间更复杂的同步机制，尤其是在高频率下维持信号完整性和时序准确性。</p></li> <li><p><strong>功耗增加</strong>：虽然 DDR 编程提升了数据传输速度，但高频率和双沿传输也会增加系统的功耗，这在某些对功耗敏感的应用中可能成为限制因素。</p></li> <li><p><strong>硬件兼容性要求</strong>：DDR 编程需要 NAND Flash 芯片和控制器都支持 DDR 模式，因此选择合适的硬件配置非常重要。</p></li></ol> <h3 id="总结-6"><a href="#总结-6" class="header-anchor">#</a> 总结：</h3> <p><strong>DDR 编程</strong> 是一种基于双沿数据传输的 NAND Flash 编程技术，通过在时钟的上升沿和下降沿同时传输数据，显著提高了数据传输速率。这种技术主要应用于高性能存储设备和数据密集型应用场景。虽然 DDR 编程带来了显著的性能提升，但它也增加了系统设计的复杂性和功耗，需要在实际应用中综合考虑其优缺点。</p> <h2 id="_12-什么是-open-block"><a href="#_12-什么是-open-block" class="header-anchor">#</a> 12. 什么是“Open Block”？</h2> <p><strong>Open Block</strong> 是 NAND Flash 存储器中的一个概念，通常指的是可以被编程和写入的空闲块（Block）。在 NAND Flash 中，数据以块为单位进行擦除和管理，每个块包含多个页（Page）。这些块可以分为“Open Block”和“Closed Block”，分别对应可以进行数据操作的块和已经满载数据或处于保护状态的块。</p> <h3 id="关键概念-3"><a href="#关键概念-3" class="header-anchor">#</a> 关键概念：</h3> <ol><li><p><strong>Block（块）</strong>：NAND Flash 中，块是最小的擦除单位。每个块包含多个页，通常一个块的大小为几百KB到几MB不等，具体取决于 NAND Flash 的架构和类型。</p></li> <li><p><strong>Open Block（开放块）</strong>：这是一个空闲的块，尚未被填满或者是部分填充的数据块，仍然可以继续写入数据。Open Block 主要用于存储新的数据或在某些需要更新的操作中充当目标块。</p></li> <li><p><strong>Closed Block（关闭块）</strong>：与 Open Block 相对，Closed Block 是已经满载数据或处于写保护状态的块，不能再继续写入数据。通常在垃圾回收（Garbage Collection）过程中，Closed Block 会被标记为不可写，等待擦除操作。</p></li></ol> <h3 id="open-block-的特点"><a href="#open-block-的特点" class="header-anchor">#</a> Open Block 的特点：</h3> <ol><li><p><strong>可写性</strong>：Open Block 是可以进行写入操作的块，当主控器需要写入新的数据时，它会选择一个 Open Block 来进行编程操作。</p></li> <li><p><strong>动态分配</strong>：在 NAND Flash 存储中，Open Block 的状态是动态变化的。随着数据写入操作的进行，一个块会从 Open Block 逐渐变成 Closed Block，直到写满为止。</p></li> <li><p><strong>垃圾回收和磨损均衡</strong>：在 NAND Flash 中，随着时间的推移和数据的反复写入，Open Block 的数量会减少，这时需要进行垃圾回收操作（GC），将某些被标记为无效数据的 Closed Block 进行擦除，以重新转换为 Open Block。控制器通过磨损均衡算法，确保不同块的擦写次数大致相等，延长 Flash 的使用寿命。</p></li></ol> <h3 id="open-block-的应用场景"><a href="#open-block-的应用场景" class="header-anchor">#</a> Open Block 的应用场景：</h3> <ol><li><p><strong>数据写入</strong>：当有新的数据要写入 NAND Flash 时，控制器会选择一个 Open Block 来进行写操作。如果当前没有 Open Block，则需要通过垃圾回收机制释放新的块。</p></li> <li><p><strong>磨损均衡</strong>：为了防止某些块因为频繁的擦写而迅速老化，控制器会在不同块之间均匀分配写入负荷，确保足够数量的 Open Block 始终可用。</p></li> <li><p><strong>文件系统的管理</strong>：许多文件系统（如 FAT、EXT 等）在底层存储管理中，依赖 Open Block 的存在来进行有效的数据组织和更新操作。</p></li></ol> <h3 id="总结-7"><a href="#总结-7" class="header-anchor">#</a> 总结：</h3> <p><strong>Open Block</strong> 是 NAND Flash 中当前可以进行数据写入操作的块，它动态变化，随着数据写入逐渐转变为 Closed Block。当所有的块都变为 Closed Block 后，垃圾回收机制会擦除部分块，将它们重新设为 Open Block。Open Block 在 NAND Flash 的数据管理、文件系统操作和磨损均衡中起着关键作用。</p> <h2 id="_13-简述什么是-readretry"><a href="#_13-简述什么是-readretry" class="header-anchor">#</a> 13. 简述什么是“ReadRetry“</h2> <p><strong>Read Retry</strong> 是 NAND Flash 存储器中的一种机制，用于应对因 NAND Flash 单元退化或其他因素导致的读出错误。随着 NAND Flash 的使用次数增加（即写入/擦除次数的增多），存储单元的可靠性会下降，可能会导致读取操作中的错误。为了提高数据读取的可靠性，Read Retry 技术允许控制器在读出数据时，通过调整读取条件来多次尝试，直到成功读取到正确的数据。</p> <h3 id="关键概念-4"><a href="#关键概念-4" class="header-anchor">#</a> 关键概念：</h3> <ol><li><p><strong>NAND Flash 退化</strong>：随着 NAND Flash 进行多次编程和擦除（P/E 循环），存储单元的电荷保留能力会变差，导致读取数据时电压阈值变得不稳定，从而可能出现读取错误。</p></li> <li><p><strong>读取错误</strong>：在读取 NAND Flash 中的数据时，由于电压漂移或闪存单元的老化，读取的数据可能不准确。通常表现为位反转或读出的数据与实际存储的数据不符。</p></li> <li><p><strong>Read Retry 机制</strong>：当读取操作出现错误时，NAND Flash 控制器会通过调整读取电压或其他参数，重新尝试读取操作。每次读取尝试都会改变读取条件（如调整参考电压），直到成功读取正确的数据或达到最大重试次数。</p></li></ol> <h3 id="read-retry-的工作原理"><a href="#read-retry-的工作原理" class="header-anchor">#</a> Read Retry 的工作原理：</h3> <ol><li><p><strong>检测读取错误</strong>：当控制器通过 ECC（Error Correction Code）检测到读取错误时，会触发 Read Retry 机制。</p></li> <li><p><strong>调整读取电压</strong>：NAND Flash 采用存储单元的阈值电压（Vt）来区分不同的存储状态。由于存储单元老化或其他物理原因，阈值电压可能发生漂移，导致读取错误。Read Retry 通过动态调整读取电压范围（如上下移动读取电压窗口）来改善读取数据的正确性。</p></li> <li><p><strong>多次读取尝试</strong>：控制器根据不同的电压调整方案，重复读取数据。在不同的重试条件下读取操作会持续进行，直到成功读取到正确的数据，或达到设定的重试次数上限。</p></li> <li><p><strong>成功读取或返回失败</strong>：如果在所有重试中仍未能读取到正确的数据，控制器将会返回读取失败错误，可能会标记该块或页面为不可靠。</p></li></ol> <h3 id="read-retry-的优点"><a href="#read-retry-的优点" class="header-anchor">#</a> Read Retry 的优点：</h3> <ol><li><p><strong>提高读取成功率</strong>：通过调整读取电压或其他参数，Read Retry 可以提高从退化的 NAND Flash 存储单元中正确读取数据的几率，降低了读取错误的概率。</p></li> <li><p><strong>延长 NAND Flash 使用寿命</strong>：在 NAND Flash 逐渐老化的过程中，Read Retry 允许在不擦除或更换存储块的情况下继续成功读取数据，延缓了存储器的老化过程。</p></li> <li><p><strong>增强数据可靠性</strong>：通过结合 ECC 和 Read Retry 技术，存储器系统能够更好地应对数据错误，确保数据可靠性，尤其是在存储器高频率读写的情况下。</p></li></ol> <h3 id="read-retry-的局限性"><a href="#read-retry-的局限性" class="header-anchor">#</a> Read Retry 的局限性：</h3> <ol><li><p><strong>延迟增加</strong>：由于每次读取错误时都需要进行多次重试，Read Retry 机制会导致读取操作的时间变长，增加了系统的响应延迟。</p></li> <li><p><strong>硬件复杂性</strong>：Read Retry 需要在硬件和控制器层面上实现更复杂的电压调节和重试机制，这增加了 NAND Flash 的设计复杂性和制造成本。</p></li> <li><p><strong>有限的重试次数</strong>：Read Retry 不是无限次的重试，通常有一个重试次数的上限。如果超过最大重试次数仍然无法读取正确的数据，数据可能会丢失或需要其他修复机制。</p></li></ol> <h3 id="read-retry-的应用场景"><a href="#read-retry-的应用场景" class="header-anchor">#</a> Read Retry 的应用场景：</h3> <ol><li><p><strong>高密度 NAND Flash</strong>：随着 NAND Flash 制造工艺的发展，存储密度越来越高，特别是 MLC（多层单元）和 TLC（三级单元）闪存的可靠性问题更为突出，Read Retry 技术变得尤为重要。</p></li> <li><p><strong>长时间使用的存储设备</strong>：如固态硬盘（SSD）、U 盘等长时间使用后会出现存储单元退化现象，Read Retry 能够有效帮助这些设备在老化时仍然保持数据读取的准确性。</p></li> <li><p><strong>高可靠性存储场景</strong>：在一些对数据可靠性要求较高的应用中（如数据中心、企业级存储设备），Read Retry 能提高 NAND Flash 的数据可靠性。</p></li></ol> <h3 id="总结-8"><a href="#总结-8" class="header-anchor">#</a> 总结：</h3> <p><strong>Read Retry</strong> 是一种提高 NAND Flash 存储器数据读取可靠性的技术。当存储单元由于退化或其他原因导致读取失败时，通过调整读取条件进行多次尝试，可以成功获取正确的数据。虽然这项技术能够延长存储器的寿命并提升数据读取成功率，但它也会带来读取延迟和硬件设计复杂性的增加。</p> <h2 id="_14-什么是-shared-page-groupe-page-对-flash-有什么影响"><a href="#_14-什么是-shared-page-groupe-page-对-flash-有什么影响" class="header-anchor">#</a> 14. 什么是 Shared Page/Groupe Page，对 Flash 有什么影响？</h2> <p><strong>Shared Page</strong>（共享页）或 <strong>Group Page</strong>（组页）是 NAND Flash 中的一种存储布局概念，主要涉及 NAND Flash 中多个存储单元之间的共享资源，例如在编程或读取时共享某些控制信号或电路。它们通常用于优化 NAND Flash 的存储密度和成本，但也带来了一些操作上的限制和复杂性。</p> <h3 id="shared-page-group-page-的概念"><a href="#shared-page-group-page-的概念" class="header-anchor">#</a> Shared Page / Group Page 的概念：</h3> <ol><li><p><strong>Shared Page</strong>：在某些 NAND Flash 架构中，多个存储单元（通常是相邻的页）共享同一组控制线路、位线（bitline）或其他电气元件。这意味着对其中一个存储单元的操作（如编程或擦除）可能会影响共享同一组资源的其他单元。</p></li> <li><p><strong>Group Page</strong>：类似于 Shared Page，但更侧重于多页作为一个组一同进行操作。通常，Group Page 指的是 NAND Flash 内多个页组成的一个编程或擦除单元，多个页之间共享相同的电压控制、时钟信号等电路资源。</p></li></ol> <h3 id="flash-中的影响"><a href="#flash-中的影响" class="header-anchor">#</a> Flash 中的影响：</h3> <h4 id="_1-编程限制"><a href="#_1-编程限制" class="header-anchor">#</a> 1. <strong>编程限制</strong>：</h4> <ul><li><strong>共享干扰</strong>：由于 Shared Page 或 Group Page 的页之间共享某些硬件资源，编程一个页面可能会影响相邻页面的状态。这种干扰通常表现为电压波动，可能导致比特翻转、数据丢失或需要额外的错误校正。</li> <li><strong>批量编程要求</strong>：在某些 NAND Flash 中，多个页可能需要作为一个整体来进行编程（例如同时编程两个 Plane 或多个页面），这限制了单独编写单个页面的灵活性，可能会导致效率下降，尤其是在随机写入操作时。</li></ul> <h4 id="_2-读取干扰"><a href="#_2-读取干扰" class="header-anchor">#</a> 2. <strong>读取干扰</strong>：</h4> <ul><li><p><strong>读取噪声</strong>：在读取一个共享页面时，另一个与之共享资源的页面可能会引入噪声，从而增加读取错误的几率。控制器可能需要通过技术（如 Read Retry 或 ECC）来解决这些问题，确保数据的可靠读取。</p></li> <li><p><strong>数据保留影响</strong>：因为多个页面共享资源，如果这些资源老化或退化，可能会对相邻页面的数据保留产生负面影响。这对于高密度 NAND Flash（如 MLC、TLC）尤为明显，因为多位数据存储在相邻的物理单元中。</p></li></ul> <h4 id="_3-性能影响"><a href="#_3-性能影响" class="header-anchor">#</a> 3. <strong>性能影响</strong>：</h4> <ul><li><p><strong>编程性能</strong>：Shared Page 和 Group Page 结构在设计上是为了提高存储密度，因此在大多数情况下，批量编程可以提高性能。然而，在某些需要随机写入的场景中，由于无法单独操作某些页，这种结构可能会导致性能下降。</p></li> <li><p><strong>擦除时间</strong>：如果 NAND Flash 的擦除操作涉及多个共享的页面或组页，那么每次擦除操作都必须影响整个块或页面组。这会增加擦除操作的时间，进而影响整体系统性能。</p></li></ul> <h4 id="_4-存储密度"><a href="#_4-存储密度" class="header-anchor">#</a> 4. <strong>存储密度</strong>：</h4> <ul><li><strong>提升存储密度</strong>：Shared Page 和 Group Page 的主要优点是通过共享资源，减少了每个单元所需的物理电路，提升了 NAND Flash 的存储密度。这对于高容量设备（如 SSD、USB 闪存、手机存储）非常有利，因为它能够以较低的成本提供更大的存储容量。</li></ul> <h4 id="_5-可靠性与数据恢复"><a href="#_5-可靠性与数据恢复" class="header-anchor">#</a> 5. <strong>可靠性与数据恢复</strong>：</h4> <ul><li><p><strong>数据损坏风险增加</strong>：由于多个页共享相同的资源，单页操作可能会影响到相邻页的状态，尤其是在电荷泄漏或电压不稳定的情况下。这种影响在 NAND Flash 单元老化的过程中会愈发显著，可能需要更频繁地使用 ECC（Error Correction Code）等技术来纠正错误。</p></li> <li><p><strong>冗余设计</strong>：为了应对共享干扰带来的可靠性问题，NAND Flash 通常需要设计更强大的错误校正和数据恢复机制，例如增强的 ECC 或使用更多的缓冲区。</p></li></ul> <h3 id="总结-9"><a href="#总结-9" class="header-anchor">#</a> 总结：</h3> <p><strong>Shared Page</strong> 和 <strong>Group Page</strong> 结构通过共享资源提高了 NAND Flash 的存储密度，从而降低了制造成本，并提高了批量操作的效率。然而，这种共享带来了编程和读取时的干扰问题，可能影响数据的可靠性和操作性能。在高密度 NAND Flash 设备中，使用 Shared Page 技术可以有效提升存储容量，但需要通过额外的错误校正和数据恢复机制来确保数据的完整性。</p> <h2 id="_15-简述-toggle-和-onfi-的主要差异"><a href="#_15-简述-toggle-和-onfi-的主要差异" class="header-anchor">#</a> 15. 简述 Toggle 和 ONFI 的主要差异</h2> <p><strong>Toggle 模式</strong> 和 <strong>ONFI（Open NAND Flash Interface）模式</strong> 是 NAND Flash 的两种主要接口规范，它们的主要区别在于数据传输的方式和协议设计。以下是它们的详细对比：</p> <h3 id="_1-标准来源"><a href="#_1-标准来源" class="header-anchor">#</a> 1. <strong>标准来源</strong>：</h3> <ul><li><p><strong>ONFI</strong>：由 ONFI 工作组（Open NAND Flash Interface）制定的标准，目的是统一 NAND Flash 的接口，使得不同厂商的 NAND Flash 能够更好地兼容和互操作。ONFI 规范的版本不断升级，目前支持同步数据传输。</p></li> <li><p><strong>Toggle 模式</strong>：由 NAND Flash 制造商（例如东芝、三星等）开发，作为与 ONFI 并行发展的技术。它与 ONFI 一样，旨在提高 NAND Flash 数据传输的速度，但采用了不同的信号处理方式。</p></li></ul> <h3 id="_2-信号时钟机制"><a href="#_2-信号时钟机制" class="header-anchor">#</a> 2. <strong>信号时钟机制</strong>：</h3> <ul><li><p><strong>ONFI</strong>：==使用同步接口，需要外部时钟信号。==数据传输时，控制器会提供一个时钟信号，NAND Flash 根据这个时钟进行同步的读写操作。==ONFI 规范支持同步数据传输，能够提高读写速度。==</p></li> <li><p><strong>Toggle 模式</strong>：==使用异步接口，不依赖外部时钟信号。==数据传输是基于数据和命令的电平切换，即通过控制信号的电平变化来实现数据同步。这种设计减少了对外部时钟的依赖，提高了系统的容错性。</p></li></ul> <h3 id="_3-数据传输模式"><a href="#_3-数据传输模式" class="header-anchor">#</a> 3. <strong>数据传输模式</strong>：</h3> <ul><li><p><strong>ONFI</strong>：采用同步数据传输，控制器提供时钟信号，数据按时钟的上升沿或下降沿传输。同步模式下，数据传输速率较高，适合高性能需求的应用场景。ONFI 4.0 规范甚至支持高达 800 MB/s 的传输速度。</p></li> <li><p><strong>Toggle 模式</strong>：数据传输采用异步的方式，使用数据切换时序（Toggle Timing）。Toggle 模式也可以实现高传输速率，尤其是在 Toggle 2.0 版本中，数据传输速率达到 400 MB/s，与 ONFI 同步接口的速度相当。通过引入双倍数据速率（DDR），Toggle 模式在数据时钟变化时进行数据传输（上升沿和下降沿均传输数据）。</p></li></ul> <h3 id="_4-传输速率"><a href="#_4-传输速率" class="header-anchor">#</a> 4. <strong>传输速率</strong>：</h3> <ul><li><p><strong>ONFI</strong>：早期版本的 ONFI（如 ONFI 1.x）速度较低，大约为 50 MB/s，而在后续版本（如 ONFI 4.0）中，传输速率可以达到 800 MB/s。</p></li> <li><p><strong>Toggle 模式</strong>：Toggle 1.0 版本的传输速率为 133 MB/s，Toggle 2.0 版本则可以达到 400 MB/s，性能与 ONFI 后期版本相当。</p></li></ul> <h3 id="_5-引脚与兼容性"><a href="#_5-引脚与兼容性" class="header-anchor">#</a> 5. <strong>引脚与兼容性</strong>：</h3> <ul><li><p><strong>ONFI</strong>：ONFI 规范使用一套固定的引脚定义，保证了不同 NAND Flash 设备之间的互操作性。采用标准化的接口定义，使得不同厂商的 NAND Flash 可以在同一主控器上运行。</p></li> <li><p><strong>Toggle 模式</strong>：虽然 Toggle 模式的 NAND Flash 设备与 ONFI 在功能上相似，但引脚定义并不完全兼容。这意味着 Toggle 模式的 NAND Flash 通常需要特定的控制器才能正常工作。</p></li></ul> <h3 id="_6-能效"><a href="#_6-能效" class="header-anchor">#</a> 6. <strong>能效</strong>：</h3> <ul><li><p><strong>ONFI</strong>：由于使用同步时钟，在高频率工作下，电能消耗会较高。尽管如此，ONFI 不断优化协议，降低了高性能工作下的功耗。</p></li> <li><p><strong>Toggle 模式</strong>：Toggle 模式使用的是异步信号切换，因此在某些应用场景中功耗较低，尤其是在低频操作时。</p></li></ul> <h3 id="_7-时钟管理和复杂性"><a href="#_7-时钟管理和复杂性" class="header-anchor">#</a> 7. <strong>时钟管理和复杂性</strong>：</h3> <ul><li><p><strong>ONFI</strong>：需要外部时钟进行同步，因此时钟管理和实现相对复杂。这种复杂性带来了更高的传输效率，但也增加了系统设计的难度。</p></li> <li><p><strong>Toggle 模式</strong>：由于不依赖外部时钟，而是通过电平切换进行数据传输，其设计相对简单，减少了时钟同步的复杂性，降低了潜在的传输误差。</p></li></ul> <h3 id="_8-市场应用"><a href="#_8-市场应用" class="header-anchor">#</a> 8. <strong>市场应用</strong>：</h3> <ul><li><p><strong>ONFI</strong>：由于它是一个开放的标准，得到了广泛的支持。许多 NAND Flash 制造商和控制器厂商都支持 ONFI 接口，使其在 SSD 和其他存储设备中被广泛采用。</p></li> <li><p><strong>Toggle 模式</strong>：尽管 Toggle 模式主要由一些特定的厂商支持（如三星和东芝），但由于其高效的性能和简单的设计，它在某些高性能 NAND Flash 中也有广泛应用。</p></li></ul> <h3 id="总结-10"><a href="#总结-10" class="header-anchor">#</a> 总结：</h3> <ul><li><strong>ONFI</strong> 使用同步接口，依赖时钟信号进行数据传输，适合高性能和标准化的应用场景，得到了广泛的行业支持。</li> <li><strong>Toggle 模式</strong> 则使用异步接口，不需要外部时钟信号，数据通过电平切换传输，设计相对简单，适合一些特定的高性能 NAND Flash 设备。</li></ul> <p>两者各有优劣，选择哪种接口主要取决于系统的设计需求和使用的 NAND Flash 芯片类型。</p> <h2 id="_16-描述常见的-flash-的编程、读的操作命令"><a href="#_16-描述常见的-flash-的编程、读的操作命令" class="header-anchor">#</a> 16. 描述常见的 Flash 的编程、读的操作命令</h2> <p>常见的 Flash（特别是 NAND Flash）编程和读取操作需要通过一系列特定的命令来完成。以下是 NAND Flash 中最常见的编程和读取命令的详细描述。</p> <h3 id="一、编程操作命令"><a href="#一、编程操作命令" class="header-anchor">#</a> 一、编程操作命令</h3> <p>编程（Program）操作是将数据写入到 NAND Flash 中的过程。NAND Flash 编程通常是以“页”为单位进行的，以下是常见的编程命令：</p> <h4 id="_1-页编程-page-program"><a href="#_1-页编程-page-program" class="header-anchor">#</a> 1. <strong>页编程（Page Program）</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>80h</strong>：写入页编程的起始命令。控制器发送 <code>80h</code> 命令，表示即将开始写入数据。</li> <li><strong>Column Address</strong>：发送列地址，确定要写入的列（数据的起始位置）。</li> <li><strong>Row Address</strong>：发送行地址，确定目标页的地址（要写入的页）。</li> <li><strong>Data Input</strong>：向闪存发送要编程的数据，一般按照字节或字节块的形式发送。</li> <li><strong>10h</strong>：发送 <code>10h</code> 作为确认命令，启动编程操作。</li></ol></li> <li><p><strong>功能</strong>：该命令用于将数据写入到指定页中，通常需要先将数据存入内部数据缓存区，然后再将其写入到 NAND Flash 的物理页中。</p></li></ul> <h4 id="_2-copy-back-编程"><a href="#_2-copy-back-编程" class="header-anchor">#</a> 2. <strong>Copy-back 编程</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>00h</strong>：读取命令，用于指定要从中复制数据的页的起始列地址。</li> <li><strong>35h</strong>：触发 <code>Copy-back</code> 操作，将读取到的数据直接写入另一个页，而无需通过主机读取再写入。</li> <li><strong>Column Address</strong> 和 <strong>Row Address</strong>：指定目标列和页地址。</li></ol></li> <li><p><strong>功能</strong>：该命令允许直接从一个页复制数据到另一个页，而不需要通过主机进行数据缓存，从而节省时间。通常用于块迁移或数据回收。</p></li></ul> <h4 id="_3-multi-plane-编程"><a href="#_3-multi-plane-编程" class="header-anchor">#</a> 3. <strong>Multi-Plane 编程</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>80h</strong>：起始命令，指定要编程的数据页。</li> <li><strong>Data Input</strong>：写入多个 Plane 的数据，指定目标列和行地址。</li> <li><strong>11h</strong>：确认编程多个 Plane 的操作。</li></ol></li> <li><p><strong>功能</strong>：允许同时编程多个 Plane 中的页，大幅提高了写入性能和并行度。</p></li></ul> <h3 id="二、读取操作命令"><a href="#二、读取操作命令" class="header-anchor">#</a> 二、读取操作命令</h3> <p>读取（Read）操作是从 NAND Flash 中获取数据的过程，常见的读取命令包括标准页读取、Cache 读取和 Multi-Plane 读取等。</p> <h4 id="_1-标准页读取-page-read"><a href="#_1-标准页读取-page-read" class="header-anchor">#</a> 1. <strong>标准页读取（Page Read）</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>00h</strong>：发送读取命令的起始指令，表示准备读取数据。</li> <li><strong>Column Address</strong>：发送列地址，确定从哪一列开始读取。</li> <li><strong>Row Address</strong>：发送行地址，确定读取哪一页的数据。</li> <li><strong>30h</strong>：确认读取命令，触发读取操作。</li></ol></li> <li><p><strong>功能</strong>：这是标准的读取操作，将指定页的数据读取到内部缓冲区，然后通过数据总线输出到主机。读取的数据量通常是按页（Page）来确定的。</p></li></ul> <h4 id="_2-cache-读取-cache-read"><a href="#_2-cache-读取-cache-read" class="header-anchor">#</a> 2. <strong>Cache 读取（Cache Read）</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>31h</strong>：Cache 读取命令，允许在页数据正在加载到缓存时提前读取部分数据。</li> <li><strong>Sequential Column Address</strong>：发送列地址，指定开始读取的列地址。</li></ol></li> <li><p><strong>功能</strong>：用于在数据读取过程中通过缓存机制提高读取速度。在大规模连续读取时非常有效，减少了等待时间。</p></li></ul> <h4 id="_3-multi-plane-读取"><a href="#_3-multi-plane-读取" class="header-anchor">#</a> 3. <strong>Multi-Plane 读取</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>00h</strong>：起始读取命令，指定 Plane 1 中的页。</li> <li><strong>Column Address</strong> 和 <strong>Row Address</strong>：发送第一个 Plane 的地址。</li> <li><strong>00h（或相应的 Plane 读取命令）</strong>：指定 Plane 2 中的页。</li> <li><strong>Column Address</strong> 和 <strong>Row Address</strong>：发送第二个 Plane 的地址。</li> <li><strong>30h</strong>：确认读取多个 Plane 的操作。</li></ol></li> <li><p><strong>功能</strong>：用于同时从多个 Plane 读取数据，以提高读取性能。类似于 Multi-Plane 编程命令。</p></li></ul> <h4 id="_4-随机数据读取-random-data-read"><a href="#_4-随机数据读取-random-data-read" class="header-anchor">#</a> 4. <strong>随机数据读取（Random Data Read）</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>05h</strong>：发送随机数据读取命令。</li> <li><strong>Column Address</strong>：指定从该列开始读取随机数据。</li> <li><strong>E0h</strong>：确认随机读取操作。</li></ol></li> <li><p><strong>功能</strong>：允许在页中指定任意的列地址进行数据读取，避免从固定起始位置开始读取，提供更多灵活性。</p></li></ul> <h3 id="三、其他常见的操作命令"><a href="#三、其他常见的操作命令" class="header-anchor">#</a> 三、其他常见的操作命令</h3> <h4 id="_1-块擦除-block-erase"><a href="#_1-块擦除-block-erase" class="header-anchor">#</a> 1. <strong>块擦除（Block Erase）</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>60h</strong>：发送擦除命令的起始指令。</li> <li><strong>Row Address</strong>：发送块地址（即要擦除的块所在的行地址）。</li> <li><strong>D0h</strong>：确认擦除操作。</li></ol></li> <li><p><strong>功能</strong>：擦除指定块中的所有页，将其恢复到初始状态（即将所有比特重置为 1）。由于 NAND Flash 需要先擦除才能进行新的编程操作，因此这是一个基础操作。</p></li></ul> <h4 id="_2-读状态寄存器-read-status-register"><a href="#_2-读状态寄存器-read-status-register" class="header-anchor">#</a> 2. <strong>读状态寄存器（Read Status Register）</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>70h</strong>：发送读取状态寄存器命令。</li> <li>读取状态寄存器的值（通常表示上一个操作的结果，如编程或擦除是否成功）。</li></ol></li> <li><p><strong>功能</strong>：用于检查 NAND Flash 的当前状态，包括操作是否成功、是否有故障、是否忙等。</p></li></ul> <h4 id="_3-读设备-id-read-id"><a href="#_3-读设备-id-read-id" class="header-anchor">#</a> 3. <strong>读设备 ID（Read ID）</strong></h4> <ul><li><p><strong>Command Sequence</strong>：</p> <ol><li><strong>90h</strong>：发送读设备 ID 命令。</li> <li><strong>Address Input</strong>：发送地址以指定要读取的信息（通常是 00h 地址读取制造商 ID）。</li> <li>读取设备的 ID 信息（制造商 ID、设备型号等）。</li></ol></li> <li><p><strong>功能</strong>：用于读取 NAND Flash 的设备信息，以便主机能够识别和初始化设备。</p></li></ul> <h3 id="总结-11"><a href="#总结-11" class="header-anchor">#</a> 总结：</h3> <ul><li><strong>编程命令</strong> 主要用于将数据写入 NAND Flash，涉及页编程、复制编程、Multi-Plane 编程等。</li> <li><strong>读取命令</strong> 主要用于从 NAND Flash 中获取数据，常见的包括标准页读取、缓存读取、随机数据读取等。</li> <li><strong>其他命令</strong> 包括擦除操作、状态寄存器读取、设备 ID 读取等，这些命令用于管理和维护 NAND Flash 的正常运行。</li></ul> <p>这些命令构成了 NAND Flash 与主机之间通信的基础，控制器通过这些命令实现数据的读写、擦除等操作，从而管理和利用 NAND Flash 存储资源。</p></div></div> <!----> <div class="page-edit"><!----> <!----> <!----></div> <div class="page-nav-wapper"><div class="page-nav-centre-wrap"><a href="/pages/d146b8/" class="page-nav-centre page-nav-centre-prev"><div class="tooltip">主流先进封装技术介绍</div></a> <a href="/pages/90d8d0/" class="page-nav-centre page-nav-centre-next"><div class="tooltip">基于PA算法的FTL引导</div></a></div> <div class="page-nav"><p class="inner"><span class="prev">
        ←
        <a href="/pages/d146b8/" class="prev">主流先进封装技术介绍</a></span> <span class="next"><a href="/pages/90d8d0/">基于PA算法的FTL引导</a>→
      </span></p></div></div></div> <!----></main></div> <div class="footer"><!----> 
  Theme by
  <a href="https://github.com/xugaoyi/vuepress-theme-vdoing" target="_blank" title="本站主题">Vdoing</a> 
    | Copyright © 2023-2025
    <span>霜晨月</span></div> <div class="buttons"><div title="返回顶部" class="button blur go-to-top iconfont icon-fanhuidingbu" style="display:none;"></div> <div title="去评论" class="button blur go-to-comment iconfont icon-pinglun" style="display:none;"></div> <div title="主题模式" class="button blur theme-mode-but iconfont icon-zhuti"><ul class="select-box" style="display:none;"><li class="iconfont icon-zidong">
          跟随系统
        </li><li class="iconfont icon-rijianmoshi">
          浅色模式
        </li><li class="iconfont icon-yejianmoshi">
          深色模式
        </li><li class="iconfont icon-yuedu">
          阅读模式
        </li></ul></div></div> <!----> <!----> <!----></div><div class="global-ui"><canvas id="vuepress-canvas-cursor"></canvas></div></div>
    <script src="/assets/js/app.67adcfd9.js" defer></script><script src="/assets/js/4.9aaa1650.js" defer></script><script src="/assets/js/1.5474518c.js" defer></script><script src="/assets/js/3.593d14fc.js" defer></script><script src="/assets/js/185.bcf4ab71.js" defer></script>
  </body>
</html>
